gpt4 book ai didi

r - 如何为除data.table中的NA之外的更多变量添加滞后并导致每个观察结果?

转载 作者:行者123 更新时间:2023-12-04 11:43:46 24 4
gpt4 key购买 nike

我有一个类似于这样的 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

最佳答案

正如@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

关于r - 如何为除data.table中的NA之外的更多变量添加滞后并导致每个观察结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34897808/

24 4 0