R:合并data.tables以创建嵌套的data.table,每行包含list

时间:2016-08-04 20:21:38

标签: r vector merge nested data.table

以下代码创建了两个数据表,其中相同的列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创建嵌套表的最有效方法是什么?嵌套表应该是可能具有不同长度的单独向量的列表。

1 个答案:

答案 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_gdata.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