如何为 data.table 中不包括 NA 的更多变量添加滞后并导致每个观察结果?

Posted

技术标签:

【中文标题】如何为 data.table 中不包括 NA 的更多变量添加滞后并导致每个观察结果?【英文标题】:How to add lag and lead to each observations for more variables excluding NAs within data.table? 【发布时间】:2016-01-20 10:44:07 【问题描述】:

我有一个类似这样的data.table:

library(data.table)
mydt <- data.table(id = LETTERS[1:6], x = 1:6, y = 2:3) 
> mydt
   id x y
1:  A 1 2
2:  B 2 3
3:  C 3 2
4:  D 4 3
5:  E 5 2
6:  F 6 3

我想用添加滞后来替换值列并导致每个观察结果(即x[-1] + x + x[1])。我可以用惊人的shift() 功能做这样的事情。

cols <- c('x', 'y')
mydt[
    ,
    (cols) := shift(.SD, 1) + .SD + shift(.SD, 1, type = 'lead'),
    .SDcols = cols
][]
   id  x  y
1:  A NA NA
2:  B  6  7
3:  C  9  8
4:  D 12  7
5:  E 15  8
6:  F NA NA

但这会为没有超前/滞后值的行引入 NA。如何修改计算以仅对这些行使用可用的两个值(如na.rm = TRUE)?这样输出将是

   id  x  y
1:  A  3  5
2:  B  6  7
3:  C  9  8
4:  D 12  7
5:  E 15  8
6:  F 11  5

我尝试使用sum(..., na.rm = TRUE) 而不是+ 运算符,但这会产生错误:Error in sum(shift(.SD, 1), .SD, shift(.SD, 1, type = "lead"), na.rm = TRUE) : invalid 'type' (list) of argument

我也尝试了以下方法,但这显然给出了其他结果。

mydt[
    ,
    (cols) := lapply(
        .SD, 
        function(x) sum(shift(x, 1), x, shift(x, 1, type = 'lead'), na.rm = TRUE)
    ),
    .SDcols = cols
][]
   id   x  y
1:  A 126 90
2:  B 126 90
3:  C 126 90
4:  D 126 90
5:  E 126 90
6:  F 126 90

【问题讨论】:

或许mydt[, (cols):=lapply(.SD, function(x) shift(x, fill=0)+x+shift(x, type="lead", fill=0)) , .SDcols= cols] @akrun 您可以发布答案,因为无论如何我都不会。不错的尝试@jan btw,你在data.table 中取得了不错的进展:) 谢谢,我是如此接近...请作为答案发布,以便我接受它 @DavidArenburg 没关系。你首先提出了这个想法,所以你可以发布它。 在这种情况下,我建议@jan 回答自己,因为他完成了大部分工作。无论哪种方式,我都不会发帖。 【参考方案1】:

正如@akrun 和@DavidArenburg 所指出的,shift 函数有一个fill 参数可以解决这个问题。

cols <- c('total_open', 'total_send')
mydt[
    ,
    (cols) := shift(.SD, 1, fill = 0) + .SD + shift(.SD, 1, type = 'lead', fill = 0),
    .SDcols = cols
][]
   id  x y
1:  A  3 5
2:  B  6 7
3:  C  9 8
4:  D 12 7
5:  E 15 8
6:  F 11 5

【讨论】:

以上是关于如何为 data.table 中不包括 NA 的更多变量添加滞后并导致每个观察结果?的主要内容,如果未能解决你的问题,请参考以下文章

带有 all=True 的 merge.data.table 引入了 NA 行。它是不是正确?

将 data.table 列与数值列中的 NA 进行比较

R语言dataframe(data.table)使用用最近的前一个非NA值向前填充缺失值NA实战

在双错误类型的连接列中使用 NA 的 data.table 内部/外部连接?

在双错误类型的连接列中使用 NA 的 data.table 内部/外部连接?

如何替换表*中的NA值以用于所选列*? data.frame,data.table