以下代码创建了两个数据表,其中相同的列id_g以不同的方式显示。
table1 <- data.table(id=c(1:3), id_g = vector('list', 3L))
set(table1, j='id_g', value=list(c(1:3), c(4:6), 7))
table1
# id | id_g
# 1 | 1,2,3
# 2 | 4,5
# 3 | 6,7
table2 <- data.table(id_g = c(1:7), id_values = vector('list', 7L))
set(table2, j='id_values', value= list(c(1:5), c(1:2), 1, 2, c(3:5), 3, c(1:2)))
table2
# id_g | id_values
# 1 | 1,2,3,4,5
# 2 | 1,2
# 3 | 1
# 4 | 2
# 5 | 3,4,5
# 6 | 3
# 7 | 1,2
预期结果:
table_all
# id | id_g
# 1 | <data.table>
# 2 | <data.table>
# 3 | <data.table>
其中例如id = 1的data.table是三个向量的列表:c(1:5),c(1,2),1。
通过id_g连接表并为每个id创建嵌套表的最有效方法是什么?嵌套表应该是可能具有不同长度的单独向量的列表。
答案 0 :(得分:1)
必然会有更好的方法来选择具有id_g %in% v
的table2行,但尝试这一行是为了开始:
table_all <- table1
table_all$id_g <- lapply(table_all$id_g, function(v){table2[id_g %in% v,id_values]})
table_all
# id id_g
#1: 1 <list>
#2: 2 <list>
#3: 3 <list>
table_all$id_g[1]
#[[1]]
#[[1]][[1]]
#[1] 1 2 3 4 5
#
#[[1]][[2]]
#[1] 1 2
#
#[[1]][[3]]
#[1] 1
几乎相同,id_g
有data.table
个元素而不是list
:
table_all <- table1
table_all$id_g <- lapply(table_all$id_g, function(v){data.table(table2[id_g %in% v,id_values])})
table_all
# id id_g
#1: 1 <data.table>
#2: 2 <data.table>
#3: 3 <data.table>
table_all$id_g[1]
#[[1]]
# V1
#1: 1,2,3,4,5
#2: 1,2
#3: 1