我仍然很难思考如何使用列表的R data.table列。
这是一个 R 数据表:
library(data.table)
dt = data.table(
numericcol = rep(42, 8),
listcol = list(c(1, 22, 3), 6, 1, 12, c(5, 6, 1123), 3, 42, 1)
)
> dt
numericcol listcol
1: 42 1,22, 3
2: 42 6
3: 42 1
4: 42 12
5: 42 5, 6,1123
6: 42 3
7: 42 42
8: 42 1
我想为
numericcol
和 listcol
的元素之间的绝对值创建一列:> dt
numericcol listcol absvals
1: 42 1,22, 3 41, 20, 39
2: 42 6 36
3: 42 1 41
4: 42 12 30
5: 42 5, 6,1123 37, 36, 1081
6: 42 3 39
7: 42 42 0
8: 42 1 41
因此,我首先想到的是使用
sapply()
,如下所示:dt[, absvals := sapply(listcol, function(x) abs(x-numericcol))]
这将输出以下内容:
> dt
numericcol listcol absvals
1: 42 1,22, 3 41
2: 42 6 20
3: 42 1 39
4: 42 12 41
5: 42 5, 6,1123 20
6: 42 3 39
7: 42 42 41
8: 42 1 20
因此,
absvals
现在是一列未列出的元素,每行都有一个单独的元素,并且是与 data.table 不同的维度。(1) 如何创建
absvals
来保留 listcol
的列表结构?(2) 在这种情况下,如果我只对值的向量感兴趣,那么 R data.table 用户如何创建这样的数据结构?
也许
vec = as.vector(dt[, absvals := sapply(listcol, function(x) abs(x-numericcol))])
?
最佳答案
使用 mapply
的另一种解决方案:
dt[, absvals := mapply(listcol, numericcol, FUN = function(x, y) abs(x-y))]
#output
dt
numericcol listcol absvals
1: 42 1,22, 3 41,20,39
2: 42 6 36
3: 42 1 41
4: 42 12 30
5: 42 5, 6,1123 37, 36,1081
6: 42 3 39
7: 42 42 0
8: 42 1 41
关于r - 如何对 R data.table 中的列表列进行操作以输出另一个列表列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49939936/