多个 data.table 列到一列向量

multiple data.table columns to one column of vectors

我有一个 data.table 这样的:

tab = data.table(V1 = c('a', 'b', 'c'),
           V2 = c('d', 'e', 'f'),
           V3 = c('g', 'h', 'i'),
           id = c(1,2,3))

从这个 table 的 V1、V2、V3 列中,我想为第 i 行获取 c(V1[i],V2[i], V3[i])

的向量

我可以像这样获得所需向量的列表:

lapply(1:tab[, .N], function(x) tab[x, c(V1, V2, V3)])

哪个returns:

[[1]]
[1] "a" "d" "g"

[[2]]
[1] "b" "e" "h"

[[3]]
[1] "c" "f" "i"

但我认为这可能很慢,而且不太像 data.table。

另外,我想概括一下,我没有明确键入 V1、V2、V3,而是传递一个列名向量以这种方式处理。

as.list(transpose(tab[, .(V1, V2, V3)]))

或作为函数

tdt <- function(DT, cols) as.list(transpose(DT[, .SD, .SDcols = cols]))

tdt(tab, c('V1', 'V2', 'V3'))

# $V1
# [1] "a" "d" "g"
# 
# $V2
# [1] "b" "e" "h"
# 
# $V3
# [1] "c" "f" "i"

试试这个?

> asplit(unname(tab[, V1:V3]), 1)
[[1]]
"a" "d" "g"

[[2]]
"b" "e" "h"

[[3]]
"c" "f" "i"

使用split

split(as.matrix(tab[, V1:V3]), tab$id)
$`1`
[1] "a" "d" "g"

$`2`
[1] "b" "e" "h"

$`3`
[1] "c" "f" "i"
tab[, 1:3] |> transpose() |> as.list()

$V1
[1] "a" "d" "g"

$V2
[1] "b" "e" "h"

$V3
[1] "c" "f" "i"