我有一个我从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答案 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)]
希望最终会有更好的方法来解决这个问题。