我有以下格式的条目日志表:
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?中做到这一点?
答案 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)