2016-04-03 90 views
-1

設置的首次和最後出現我有一個表:如何找到在面板數據中的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 

請幫幫忙!

+0

可能的複製http://stackoverflow.com/questions/19944334/extract-行爲數據幀中的變量的第一次出現) – JazzCat

回答

4

我們可以使用data.table。轉換 'data.frame' 到 'data.table'(setDT(df1)),由 'ID' 進行分組,我們得到的 '時間'

library(data.table) 
setDT(df1)[, list(firstocc = time[1L], lastocc = time[.N]), 
        by = id] 

或者與dplyr,我們使用firstlast值相同的方法。

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)]))) 

如果我們需要立足於minmax值(不涉及預期的輸出),該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)) 
+0

當您按ID分組時,我不想訂購ID。我想讓它按照它的順序排列。你能幫助我嗎? –

+0

@PreetRajdeo您可以將'id'轉換爲'factor'類並設置相同順序的級別。即'df1%>%group_by(id = factor(id,levels = unique(id)))%>%summarize(firstocc = min(time),lastocc = max(time))' – akrun

3

有可以執行這種在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)。

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 
的[提取行用於可變的在數據幀中的第一次出現(