【发布时间】:2021-02-18 07:06:41
【问题描述】:
我有一个 data.table:
set.seed(1)
data <- data.table(time = c(1:3, 1:4),
groups = c(rep(c("b", "a"), c(3, 4))),
value = rnorm(7))
data
# groups time value
# 1: b 1 -0.6264538
# 2: b 2 0.1836433
# 3: b 3 -0.8356286
# 4: a 1 1.5952808
# 5: a 2 0.3295078
# 6: a 3 -0.8204684
# 7: a 4 0.4874291
我想计算“值”列的滞后版本,在每个级别的“组”中。
结果应该是这样的
# groups time value lag.value
# 1 a 1 1.5952808 NA
# 2 a 2 0.3295078 1.5952808
# 3 a 3 -0.8204684 0.3295078
# 4 a 4 0.4874291 -0.8204684
# 5 b 1 -0.6264538 NA
# 6 b 2 0.1836433 -0.6264538
# 7 b 3 -0.8356286 0.1836433
我尝试过直接使用lag:
data$lag.value <- lag(data$value)
...这显然行不通。
我也试过了:
unlist(tapply(data$value, data$groups, lag))
a1 a2 a3 a4 b1 b2 b3
NA -0.1162932 0.4420753 2.1505440 NA 0.5894583 -0.2890288
这几乎是我想要的。但是,生成的向量的顺序与 data.table 中的顺序不同,这是有问题的。
在 base R、plyr、dplyr 和 data.table 中执行此操作的最有效方法是什么?
【问题讨论】:
-
对不起,结合
group_by -
unlist(by(data, data$groups, function(x) c(NA, head(x$value, -1))))将是一种基本方式 -
@xiaodai 如果你只做一列
lag,而且数据集不大,那么base R,plyr,data.table在效率上不会有太大差异方法。 -
@akrun 明白。但是我实际上简化了它。我实际上在许多专栏中都需要它,并且为了其他用户的利益,首选通用解决方案
-
@xiaodai 我更新了多列。关于
lag为什么慢,得看lag里面的代码。您可以查看getAnywhere('lag.default')[1]
标签: r data.table plyr dplyr