从数据 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]>
我正在尝试将一个列表放入每个数据 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]>