多个 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"
我有一个 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"