【发布时间】:2023-03-05 15:38:01
【问题描述】:
我想在一个组中创建一个包含上一年变量值的变量。
id date value
1 1 1992 4.1
2 1 NA 4.5
3 1 1991 3.3
4 1 1990 5.3
5 1 1994 3.0
6 2 1992 3.2
7 2 1991 5.2
value_lagged 应该在组中缺少前一年时丢失 - 因为它是组中的第一个日期(如第 4、7 行),或者因为数据中存在年份间隔(如第 5 行)。此外,当当前时间缺失时,value_lagged 应该缺失(如第 2 行)。
这给出:
id date value value_lagged
1 1 1992 4.1 3.3
2 1 NA 4.5 NA
3 1 1991 3.3 5.3
4 1 1990 5.3 NA
5 1 1994 3.0 NA
6 2 1992 3.2 5.2
7 2 1991 5.2 NA
目前,在 R 中,我使用 data.table 包
DT = data.table(id = c(1,1,1,1,1,2,2),
date = c(1992,NA,1991,1990,1994,1992,1991),
value = c(4.1,4.5,3.3,5.3,3.0,3.2,5.2)
)
setkey(DT, id, date)
DT[, value_lagged := DT[J(id, date-1), value], ]
DT[is.na(date), value_lagged := NA, ]
它很快,但对我来说似乎有点容易出错。我想知道使用data.table、dplyr 或任何其他软件包是否有更好的选择。非常感谢!
在Stata,可以这样做:
tsset id date
gen value_lagged=L.value
【问题讨论】:
-
除非您特别希望缺少 value 的行没有匹配的滞后值,否则您可能打算使用
is.na(date)而不是is.na(value) -
是的,已更正。谢谢。
-
@Matthew 似乎您已经有了一个不错的解决方案 - 您到底想改进什么?
-
我的解决方案对我来说似乎有些复杂且容易出错 - 但可能是因为我是 R 新手。即使它是一个不错的解决方案,也可能有更简单的方法来做到这一点!无论如何,这是一个重要的问题(至少对于 stata 用户而言),所以我认为应该有一个关于堆栈溢出的明确问题/答案。
-
这是对最后两个步骤的轻微重写,这可能不太容易出错(因为你没有重复
DT多次),但我真的看不出你还想要什么具有专门设计用于执行您想要的功能(您的 stata 解决方案真正是什么):DT[J(id, date + 1, val = value), val_lag := i.val][is.na(date), val_lag := NA]
标签: r data.table dplyr panel-data