如何将data.tables与=的shift()组合而不必创建新的变量?

时间:2017-02-17 17:38:38

标签: r data.table

我试图生成变量的行和及其滞后。说我有:

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命令,因此我们将在一行中使得移位变得不可行。任何提示?

2 个答案:

答案 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]