为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

至尊宝的传说 2019-07-04 15:50:32
如何在每个组中创建一个滞后变量?我有一张数据表: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..还请注意,由于现有问题对于dplyr的某些版本,为了安全起见,应该显式地给出参数和命名空间。


查看完整回答
反对 回复 2019-07-04
  • 3 回答
  • 0 关注
  • 874 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信