我有一个像
这样的数据框 ID DATE TS_EVENT X Y Z
ID0026A 2013-01-03 2013-01-03 8:31:09 PM 25 0 0
ID0026A 2013-01-03 2013-01-03 8:31:09 PM 0 0 0
ID0026A 2013-01-03 2013-01-03 11:22:55 PM 0 0 0
ID0026A 2013-01-03 2013-01-03 11:36:05 PM 0 0 0
ID0026A 2013-01-03 2013-01-03 11:36:05 PM 0 0 0
ID0026A 2013-03-27 2013-01-03 11:36:05 PM 100 354 25
现在我想返回一个数据框,它将包含四列ID,DATE,X,Y和Z.但是col“ID”将包含唯一ID,DATE将包含该ID的最新日期,其余的cols的值将与该特定ID的最新时间戳(TS_EVENT)对应。
,例如,对于ID0026A,数据框应该看起来像
ID DATE X Y Z
ID0026A 2013-01-03 0 0 0
ID0026A 2013-03-27 100 354 25
我的数据框包含120万条记录和6000个唯一ID
注意:ID为str的字符,DATE的str为日期,TS_EVENT的str为字符,其余为数字
所以,首先我要将TS_EVENT转换为日期时间对象,然后创建所需的数据帧。
我怎样才能在R?
中这样做答案 0 :(得分:2)
根据@PauloCardoso请求,这里是data.table
解决方案
library(data.table)
idx <- setDT(df)[, .I[TS_EVENT == max(TS_EVENT)], by = c("ID", "DATE")]$V1
unique(df[idx, -3, with = F], by = c("ID", "DATE"))
## ID DATE X Y Z
## 1: ID0026A 2013-01-03 0 0 0
## 2: ID0026A 2013-03-27 100 354 25
答案 1 :(得分:1)
使用ddply
d$DATE <- ymd(d$DATE)
d$TS_EVENT <- ymd_hms(d$TS_EVENT)
plyr::ddply(d, .(ID, DATE), summarise, ts = max(TS_EVENT), date = max(DATE),
x = tail(X,1), y = tail(Y, 1), z = tail(Z, 1))
ID DATE ts date x y z
1 ID0026A 2013-01-03 2013-01-03 11:36:05 2013-01-03 0 0 0
2 ID0026A 2013-03-27 2013-01-03 11:36:05 2013-03-27 100 354 25
这项工作也适用于dplyr
d %.%
dplyr:::group_by(DATE, ID) %.%
dplyr:::summarise(ts = max(TS_EVENT), date = max(DATE),
x = tail(X,1), y= tail(Y, 1), z=tail(Z, 1))
DATE ID ts date x y z
1 2013-01-03 ID0026A 2013-01-03 11:36:05 2013-01-03 0 0 0
2 2013-03-27 ID0026A 2013-01-03 11:36:05 2013-03-27 100 354 25
谢谢@Arun !!
修改强>
我想用data.table
方法看到这一点。我无法做到。
答案 2 :(得分:0)
尝试这样的事情(t是你的数据框):
t <- t[ !duplicated(t[c("ID","DATE")], fromLast=TRUE), ][c("ID","DATE","X","Y","Z")]
复制的函数将ID和DATE组合成一个唯一的密钥,并获取最后一个条目(即该ID的最新DATE)。然后将所需的字段添加到数据框中。希望这会有所帮助。
输出:
ID DATE X Y Z
ID0026A 2013-01-03 0 0 0
ID0026A 2013-03-27 100 354 25