返回最后出现id的行

时间:2014-11-07 19:11:50

标签: r

我有以下格式的条目日志表:

timestamp,id,enabled
2014-11-07 17:16:38,1,TRUE
2014-11-07 17:44:30,2,TRUE
2014-11-07 18:07:13,2,FALSE
2014-11-07 18:11:48,1,TRUE

我想返回每个特定ID出现的最后一行。所以在上面的例子中,输出将是:

2014-11-07 18:07:13,2,FALSE
2014-11-07 18:11:48,1,TRUE

我怎么能在R?中做到这一点?

3 个答案:

答案 0 :(得分:3)

有很多方法可以做到这一点。这是使用dplyr包的方法,假设您的数据框被称为dat

library(dplyr) 

dat %>% group_by(id) %>%
  slice(length(id))  # This selects the last row for a given ID

                 date id enabled
1 2014-11-07 18:11:48  1    TRUE
2 2014-11-07 18:07:13  2   FALSE

如果你想根据一些排序变量选择最后一行,比如在这种情况下是date,那么在切片前先按日期排序:

# First, convert date string to date format
library(lubridate)
dat$date = ymd_hms(dat$date)

dat %>% group_by(id) %>%
  arrange(date) %>%
  slice(length(id))

更新:或者,如果您曾经使用@BenBolker编码打高尔夫球,并且需要从分数中删除一些字符:

dat %>% group_by(id) %>%
  slice(n())

答案 1 :(得分:2)

只需几个解决方案,无需加载任何软件包

x <- read.csv(textConnection("timestamp,id,enabled                                                                                                                                                                                            
2014-11-07 17:16:38,1,TRUE                                                                                                                                                                                                                    
2014-11-07 17:44:30,2,TRUE                                                                                                                                                                                                                    
2014-11-07 18:07:13,2,FALSE                                                                                                                                                                                                                   
2014-11-07 18:11:48,1,TRUE"),header = TRUE,stringsAsFactors =FALSE)

# Solution 1                                                                                                                                                                                                                                  
aggregate(x,by=list(x$id),FUN=function(x){tail(x,1)})

# Solution 2                                                                                                                                                                                                                                  
data.frame(do.call('rbind',as.list(by(x,x$id,tail,1))),
                      stringsAsFactors = FALSE)

答案 2 :(得分:2)

plyr中的解决方案特别紧凑(尽管可能比dplyr慢):

library("plyr")
ddply(dat,"id",tail,1)