我想创建一个变量,包含前一年组内某个变量的值。
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
is.na(date)
而不是is.na(value)
。 - Ricardo SaportaDT
),但我真的看不出你想要什么,除了一个专门设计来做你想要的事情的函数(这就是你的 stata 解决方案所做的):DT[J(id, date + 1, val = value), val_lag := i.val][is.na(date), val_lag := NA]
。 - eddiD1=DT[J(id, date + 1, val = value)]
,D1[, val_lag:=val]
和DT[J(id, date + 1, val = value)][, val_lag:=val]
不一样吗? - Matthew