我正在学习data.table,我想重现我用dplyr实现的计算。
我有一个数据框,其中包含由2个ID识别的个人的每日观察结果。我想为每个人保留最后一次观察。
例如,使用那些虚拟数据:
set.seed(42)
datas <- data.frame(id1 = rep(1:2, 2),
id2 = rep(letters[1:2], 2),
date = seq(Sys.Date() - 3, Sys.Date(), by = "day"),
x = rnorm(4))
id1 id2 date x
1 1 a 2015-08-02 1.3709584
2 2 b 2015-08-03 -0.5646982
3 1 a 2015-08-04 0.3631284
4 2 b 2015-08-05 0.6328626
这是我期待的输出:
library(dplyr)
datas %>%
group_by(id1, id2) %>%
filter(date == max(date))
Source: local data frame [2 x 4]
Groups: id1, id2
id1 id2 date x
1 1 a 2015-08-04 0.3631284
2 2 b 2015-08-05 0.6328626
这是我对data.table的尝试:
library(data.table)
datas.dt <- data.table(datas)
tmp <- datas.dt[, list(date = max(date)), by = c("id1", "id2")]
setkey(datas.dt, id1, id2, date)
setkey(tmp, id1, id2, date)
datas.dt[tmp]
id1 id2 date x
1: 1 a 2015-08-04 0.3631284
2: 2 b 2015-08-05 0.6328626
我打电话给一个联盟,所以我觉得我在基础知识上遗漏了一些东西,但我找不到更直接的方法来实现这个目标。
有没有更直接的data.table方式来实现我想做的事情?感谢。