我有一个类似的数据帧
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。但是列"ID"将包含唯一的ID,DATE将包含该ID的最新日期,其余列的值将对应于该特定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中执行此操作?
根据@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
带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
方法来看到这一点。我做不到。
试试这样的东西(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