使用R中的日期时间变量处理数据帧

时间:2014-04-28 16:06:15

标签: r datetime dataframe

我有一个像

这样的数据框
  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?

中这样做

3 个答案:

答案 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