【发布时间】:2017-01-16 19:41:12
【问题描述】:
我有一个从 JSON 数据创建的表,其中有一些嵌套的列表列,我想将它们做成自己的列(它还嵌入了空值,这就是我使用 @987654322 的原因@ 而不是 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)]
但它需要我事先知道transpose(stats) 将产生多少列,直到我转置统计数据后我才知道。最好,我想保留列表列中定义的内部名称,无论它们是什么。
有没有办法使用列表已经通过引用分配的名称?
编辑:从 purrr 转置正在做这项工作,而不是 data.table::transpose
【问题讨论】:
-
是的,您可以从第一个条目中读取名称,例如
names(dtjson$stats[[1]]) :=,对吧? -
嗯,实际上你的“This works”代码对我不起作用(运行包的开发版本 1.9.7)。但是,
dtjson[, transpose(lapply(stats, unlist))]确实如此。 -
行得通!如果我不想依赖第一行统计信息,也可以作为
names(transpose(dtjson$stats))工作,但这会增加很多计算时间。我会接受这个答案,因为在这种情况下,我知道所有名称都在每一行中定义。 -
嗯,我也在 1.9.7,当我第一次运行它时,它从一个新的环境开始,它显然没有......这很奇怪。
-
好的,已经讨论/提出了类似的事情:github.com/Rdatatable/data.table/issues/…
标签: r data.table