如何在每个组中创建一个滞后变量?

如何在每个组中创建一个滞后变量?

我有一张数据表:


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中,最有效的方法是什么?


至尊宝的传说
浏览 877回答 3
3回答

小怪兽爱吃肉

使用包dplyr:library(dplyr)data&nbsp;<-&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;%>% &nbsp;&nbsp;&nbsp;&nbsp;group_by(groups)&nbsp;%>% &nbsp;&nbsp;&nbsp;&nbsp;mutate(lag.value&nbsp;=&nbsp;dplyr::lag(value,&nbsp;n&nbsp;=&nbsp;1,&nbsp;default&nbsp;=&nbsp;NA))施予> dataSource: local data table [7 x 4]Groups: groups&nbsp; time groups&nbsp; &nbsp; &nbsp; &nbsp;value&nbsp; &nbsp;lag.value1&nbsp; &nbsp; 1&nbsp; &nbsp; &nbsp; a&nbsp; 0.07614866&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NA2&nbsp; &nbsp; 2&nbsp; &nbsp; &nbsp; a -0.02784712&nbsp; 0.076148663&nbsp; &nbsp; 3&nbsp; &nbsp; &nbsp; a&nbsp; 1.88612245 -0.027847124&nbsp; &nbsp; 1&nbsp; &nbsp; &nbsp; b&nbsp; 0.26526825&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; NA5&nbsp; &nbsp; 2&nbsp; &nbsp; &nbsp; b&nbsp; 1.23820506&nbsp; 0.265268256&nbsp; &nbsp; 3&nbsp; &nbsp; &nbsp; b&nbsp; 0.09276648&nbsp; 1.238205067&nbsp; &nbsp; 4&nbsp; &nbsp; &nbsp; b -0.09253594&nbsp; 0.09276648这隐含地假定值已经按组排序。如果没有,则按组对其进行排序,或者使用order_by争论lag..还请注意,由于现有问题对于dplyr的某些版本,为了安全起见,应该显式地给出参数和命名空间。
打开App,查看更多内容
随时随地看视频慕课网APP