如何对R data.table中的列列进行操作以输出另一个列表列?

Sha*_*ang 4 r data.table

我仍然很难想到如何使用R data.table列作为列表.

这是一个R data.table:

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
Run Code Online (Sandbox Code Playgroud)

我想为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
Run Code Online (Sandbox Code Playgroud)

所以,我的第一个想法是使用sapply()如下:

dt[, absvals := sapply(listcol, function(x) abs(x-numericcol))]
Run Code Online (Sandbox Code Playgroud)

这输出如下:

> 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
Run Code Online (Sandbox Code Playgroud)

因此,absvals现在是一列未列出的元素,每行中都有一个单独的元素,并且是与data.table不同的维度.

(1)如何创建absvals保留列表结构listcol

(2)在这些情况下,如果我只对值的向量感兴趣,那么R data.table用户如何创建这样的数据结构?

也许

vec = as.vector(dt[, absvals := sapply(listcol, function(x) abs(x-numericcol))])
Run Code Online (Sandbox Code Playgroud)

mis*_*use 6

另一种解决方案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
Run Code Online (Sandbox Code Playgroud)

  • 优越的答案.非常好 (2认同)