我有一些data.tables
这样的:
x <- data.table(id=rep(1:3, 2), a=1:6)
y <- data.table(id=1:3, b=2:4)
我可以像这样合并它们:
setkey(x, id)
setkey(y, id)
x[y]
id a b
1: 1 1 2
2: 1 4 2
3: 2 2 3
4: 2 5 3
5: 3 3 4
6: 3 6 4
现在,我想在x
基础上创建一个新列a
,b
它是和的a
总和b
。我可以这样做:
x[y, val:=a + b]
但是,现在假设由于某种原因“+”运算符未矢量化。如何将逐行计算存储到计算所需的x
位置?x[y]
另外,假设我不能使用mapply
(因为我的实际问题,mapply
不适合该功能)。
我正在尝试sapply
像这样以逐行方式添加:
x[y, sapply(1:nrow(x), function (i) a[i] + b[i])]
但是,这会返回错误的结果:
id V1
1: 1 3
2: 1 NA
3: 1 NA
4: 1 NA
5: 1 NA
6: 1 NA
7: 2 5
8: 2 NA
9: 2 NA
10: 2 NA
11: 2 NA
12: 2 NA
13: 3 7
14: 3 NA
15: 3 NA
16: 3 NA
17: 3 NA
18: 3 NA
如果我这样做,它会起作用:
x[y][, sapply(1:nrow(x), function (i) a[i] + b[i])]
# [1] 3 6 5 8 7 10
但是当我尝试将其分配给 中的列时x
,它不会被存储(这很有意义,因为看起来我正在尝试将新列保存到 中x[y]
)。
x[y][, val:=sapply(1:nrow(x), function (i) a[i] + b[i])]
有什么办法可以做到以上,但将输出保存到x[, val]
? 这是我应该这样做的方式,还是有更多的data.table
方式?
x[, val:=x[y][, sapply(1:nrow(x), function (i) a[i] + b[i])]]