2016-04-03 28 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 
的[提取行用于可变的在数据帧中的第一次出现(