【问题标题】:data.table expand sub list use names by referencedata.table 通过引用展开子列表使用名称
【发布时间】: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


【解决方案1】:

你可以的

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)]

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-13
    • 2013-05-22
    • 2023-03-27
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多