我试图生成变量的行和及其滞后。说我有:
library(data.table)
data <- data.table(id = rep(c("AT","DE"), each = 3),
time = rep(2001:2003, 2), var1 = c(1:6), var2 = c(NA, 1:3, NA, 8))
我想创建一个添加&#39; var1&#39;的变量。并且&#39; var2&#39; by&#39; id&#39;。如果我先创建滞后和总和,我知道如何:
data[ , lag := shift(var2, 1), by = id]
data[ , goalmessy := sum(var1, lag, na.rm = TRUE), by = 1:NROW(data)]
但是有没有办法在shift
或类似内容中使用sum
(比如应用sum或sth)?我所遇到的直观问题是,就我所知,首先评估by命令,因此我们将在一行中使得移位变得不可行。任何提示?
答案 0 :(得分:2)
我认为这会在一行中做你想做的事情:
dt[, myVals := rowSums(cbind(var1, shift(var2)), na.rm=TRUE), by=id]
dt
id time var1 var2 myVals
1: AT 2001 1 NA 1
2: AT 2002 2 1 2
3: AT 2003 3 2 4
4: DE 2001 4 3 4
5: DE 2002 5 NA 8
6: DE 2003 6 8 6
将两个感兴趣的变量放入cbind
,用于提取rowSums
,并删除代码中的NAs。
答案 1 :(得分:1)
我们可以使用rowSums
data[, goalmessy := rowSums(setDT(.(var1, shift(var2))), na.rm = TRUE), by = id]