从数据 table 行中获取值并将其作为 R 中的列表放入单元格中

Taking values from data table rows and putting it in a cell as a list in R

我正在尝试将一个列表放入每个数据 table 单元格中,该列表来自其他列的值。我不想明确输入每一列的名称。基本上我想重做以下工作示例而不必明确引用 V1、V2:

# Create a data table as an example:
dat <- data.table(V1 = c(1:4), V2 = c('A','B','C','D'))
print(dat)
   V1 V2
1:  1  A
2:  2  B
3:  3  C
4:  4  D

现在我创建一个包含行值列表的新变量 V3:

dat[, id := rownames(dat)] # Creating unique id per row
dat[, V3 := list(list(list(V1,V2))), by = 'id']
print(dat)
   V1 V2 id        V3
1:  1  A  1 <list[2]>
2:  2  B  2 <list[2]>
3:  3  C  3 <list[2]>
4:  4  D  4 <list[2]>

并且我们可以看到V3的第一个元素是正确的,由列表1,A组成:

unlist(dat$V3[[1]])
[1] "1" "A"

如何在不必明确列出 V1 和 V2 的情况下完成此过程(实际上在我的代码中我必须对 60 多个变量执行此操作(即从 60 个变量的行中获取一个列表),所以我不不想写 list(list(list(V1, V2, V3, ..., V60)?

我认为这会成功

dat[, v3 := lapply(transpose(dat), as.list)]
#    V1 V2        v3
# 1:  1  A <list[2]>
# 2:  2  B <list[2]>
# 3:  3  C <list[2]>
# 4:  4  D <list[2]>

unlist(dat$v3[[1]])
#[1] "1" "A"

您可以使用 apply -

library(data.table)

dat <- data.table(V1 = c(1:4), V2 = c('A','B','C','D'))
dat[, V3 := apply(.SD, 1, as.list), .SDcols = V1:V2]
dat

#   V1 V2        V3
#1:  1  A <list[2]>
#2:  2  B <list[2]>
#3:  3  C <list[2]>
#4:  4  D <list[2]>

unlist(dat$V3[[1]])
# V1  V2 
#"1" "A" 

如果您需要未命名的向量,请使用 apply 中的 unname(.SD)

使用Map我们可以做到

dat[, V3 := do.call(Map, c(f = function(x, y) as.list(c(x, y)), unname(.SD)))] 
dat
   V1 V2        V3
1:  1  A <list[2]>
2:  2  B <list[2]>
3:  3  C <list[2]>
4:  4  D <list[2]>

我们可以像下面这样使用 Map + asplit

> dat[, V3 := Map(as.list, asplit(.SD, 1))][]
   V1 V2        V3
1:  1  A <list[2]>
2:  2  B <list[2]>
3:  3  C <list[2]>
4:  4  D <list[2]>