設置的首次和最後出現我有一個表:如何找到在面板數據中的R
id time
1 1
1 2
1 5
2 3
2 2
2 7
3 8
3 3
3 14
我想將其轉換爲:
id first last
1 1 5
2 3 7
3 8 14
請幫幫忙!
設置的首次和最後出現我有一個表:如何找到在面板數據中的R
id time
1 1
1 2
1 5
2 3
2 2
2 7
3 8
3 3
3 14
我想將其轉換爲:
id first last
1 1 5
2 3 7
3 8 14
請幫幫忙!
我們可以使用data.table
。轉換 'data.frame' 到 'data.table'(setDT(df1)
),由 'ID' 進行分組,我們得到的 '時間'
library(data.table)
setDT(df1)[, list(firstocc = time[1L], lastocc = time[.N]),
by = id]
或者與dplyr
,我們使用first
和last
值相同的方法。
library(dplyr)
df1 %>%
group_by(id) %>%
summarise(firstocc = first(time), lastocc = last(time))
或用base R
(無需包裝)
do.call(rbind, lapply(split(df1, df1$id),
function(x) data.frame(id = x$id[1],
firstocc = x$time[1], lastocc = x$time[nrow(x)])))
如果我們需要立足於min
和max
值(不涉及預期的輸出),該data.table
選項是
setDT(df1)[, setNames(as.list(range(time)),
c('firstOcc', 'lastOcc')) ,id]
和dplyr
是
df1 %>%
group_by(id) %>%
summarise(firstocc = min(time), lastocc = max(time))
當您按ID分組時,我不想訂購ID。我想讓它按照它的順序排列。你能幫助我嗎? –
@PreetRajdeo您可以將'id'轉換爲'factor'類並設置相同順序的級別。即'df1%>%group_by(id = factor(id,levels = unique(id)))%>%summarize(firstocc = min(time),lastocc = max(time))' – akrun
有可以執行這種在R的聚集我們展示如何做到這一點沒有任何包裝,然後用一些包裝顯示了很多包。
1)使用aggregate
。無需包裹。
ag <- aggregate(time ~ id, DF, function(x) c(first = min(x), last = max(x)))
,並提供:
> ag
id time.first time.last
1 1 1 5
2 2 2 7
3 3 3 14
ag
是一個兩列的數據幀,其第二列包含與名爲「第一」列的兩列的矩陣,並且「最後」。如果你想將它壓平到3列數據幀使用:
do.call("cbind", ag)
捐贈:
id first last
[1,] 1 1 5
[2,] 2 2 7
[3,] 3 3 14
1A)的這種變化(1)是醜陋列名的代價更緊湊。
aggregate(time ~ id, DF, range)
2)sqldf
library(sqldf)
sqldf("select id, min(time) first, max(time) last from DF group by id")
,並提供:
id first last
[1,] 1 1 5
[2,] 2 2 7
[3,] 3 3 14
3)summaryBy summaryBy在doBy包很像aggregate
:
library(doBy)
summaryBy(time ~ id, data = DF, FUN = c(min, max))
給予:
id time.min time.max
1 1 1 5
2 2 2 7
3 3 3 14
注:這裏是在重現的形式輸入DF
:
Lines <- "id time
1 1
1 2
1 5
2 3
2 2
2 7
3 8
3 3
3 14"
DF <- read.table(text = Lines, header = TRUE)
更新:添加(1A),(2)和(3)和固定(1)。
可以刪除重複和重塑它
dd <- read.table(header = TRUE, text = "id time
1 1
1 2
1 5
2 3
2 2
2 7
3 8
3 3
3 14")
d2 <- dd[!(duplicated(dd$id) & duplicated(dd$id, fromLast = TRUE)), ]
reshape(within(d2, tt <- c('first', 'last')), dir = 'wide', timevar = 'tt')
# id time.first time.last
# 1 1 1 5
# 4 2 3 7
# 7 3 8 14
的[提取行用於可變的在數據幀中的第一次出現(
可能的複製http://stackoverflow.com/questions/19944334/extract-行爲數據幀中的變量的第一次出現) – JazzCat