如何在每个组中创建一个滞后变量?我有一张数据表: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我想计算“value”列的滞后版本,内每个级别的“组”。结果应该是# 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中的排序不同,这是有问题的。在基R、plyr、dplyr和data.table中,最有效的方法是什么?
3 回答
小怪兽爱吃肉
TA贡献1852条经验 获得超1个赞
dplyr
:
library(dplyr)data <- data %>% group_by(groups) %>% mutate(lag.value = dplyr::lag(value, n = 1, default = NA))
> data
Source: local data table [7 x 4]
Groups: groups
time groups value lag.value
1 1 a 0.07614866 NA
2 2 a -0.02784712 0.07614866
3 3 a 1.88612245 -0.02784712
4 1 b 0.26526825 NA
5 2 b 1.23820506 0.26526825
6 3 b 0.09276648 1.23820506
7 4 b -0.09253594 0.09276648
order_by
lag
添加回答
举报
0/150
提交
取消