data.table展开子列表按引用使用名称

时间:2016-09-08 18:55:03

标签: r data.table

我有一个我从JSON数据创建的表,它有一些嵌套列表列,我想将它们放入自己的列中(它也有嵌入的空值,这就是我使用{{}的原因。 1}}而不是do.call(rbind, list)):

示例数据:

rbindlist

当我们检查输出时,我们看到有一个名为# Make some sample JSON rawjson <- lapply(1:10, function(x) list(stats = list(stat1 = sample(LETTERS,1), stat2 = sample(LETTERS,1), stat3 = NULL), othervar = runif(1))) #convert to data.table dtjson <- data.table(do.call(rbind, rawjson))

的列表列
stats

现在,我可以使用> dtjson stats othervar 1: <list> 0.6980694 2: <list> 0.1696928 3: <list> 0.6168877 4: <list> 0.4322135 5: <list> 0.6941624 6: <list> 0.3354516 7: <list> 0.7159235 8: <list> 0.2019412 9: <list> 0.8908848 10: <list> 0.4643908

将该统计信息列内部翻出来
purrr::transpose

但是,我不知道如何通过引用分配这些新列。

我试过了:

library(purrr)
> dtjson[,purrr::transpose(stats)]
    stat1 stat2 stat3
 1:     U     G  NULL
 2:     J     X  NULL
 3:     D     E  NULL
 4:     F     V  NULL
 5:     V     W  NULL
 6:     Z     I  NULL
 7:     R     O  NULL
 8:     A     H  NULL
 9:     L     R  NULL
10:     A     M  NULL

另一方面,这有效:

> dtjson[,names(purrr::transpose(stats)) := purrr::transpose(stats)]
Error in transpose(stats) : object 'stats' not found

但是它要求我事先确切知道 dtjson[, paste0('V',1:3) := purrr::transpose(stats)] 会产生多少列,在我转换统计数据之前我可能不知道。最好是,我想保留列表列中定义的内部名称,无论它们是什么。

有没有办法使用列表已经通过引用分配的名称?

编辑:purrr的转置正在完成工作,而不是data.table :: transpose

1 个答案:

答案 0 :(得分:3)

你可以做到

dtjson[, names(s <- purrr::transpose(dtjson$stats)) := s]
rm(s)

我在data.table问题跟踪器上借了这个from @MichaelChirico's post

另一种不依赖于s是未使用的变量名称的替代方案是

dtjson[, names(dtjson$stats[[1]]) := purrr::transpose(stats)]

希望最终会有更好的方法来解决这个问题。