我可以帮助你进行翻译。以下是与此类似的数据表:
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]
- akrundata.table
方面取得了不错的进展:) - David Arenburg