【问题标题】:Converting a JSON text field of unequal nesting depth to a dataframe将嵌套深度不等的 JSON 文本字段转换为数据框
【发布时间】:2019-10-03 13:54:28
【问题描述】:

我正在尝试将数据提取中的列转换为 data.frame

假设在表 extract 中,我有一列 extract$stage 类型为:character,其中前 11 行类似于以下内容

extract <- read.table (text = 
'stage
{"Stages":{"SBS":{"Type":"N/A","Max":"N/A"}}}
{"Stages":{"SBS":{"Type":"N/A","Max":"N/A"}}}
{"Stages":{"SBS":{"Type":"N/A","Max":"N/A"}}}
{"Stages":{"SBS":[{"Type":"Land","Max":"60%"},{"Type":"Dcon","Max":"70%"},{"Type":"Finish","Max":"80%"}]}}
{"Stages":{"SBS":{"Type":"N/A","Max":"N/A"}}}
{"Stages":{"SBS":{"Type":"N/A","Max":"N/A"}}}
{"Stages":{"SBS":{"Type":"N/A","Max":"N/A"}}}
{"Stages":{"SBS":{"Type":"N/A","Max":"N/A"}}}
{"Stages":{"SBS":[{"Type":"Land","Max":"80%"},{"Type":"Dcon","Max":"80%"},{"Type":"Finish","Max":"80%"}]}}
{"Stages":{"SBS":{"Type":"N/A","Max":"N/A"}}}
{"Stages":{"SBS":{"Type":"N/A","Max":"N/A"}}}',
header = T, stringsAsFactors = F)

最后我想要的是一个具有相同行数但有额外列的数据框,这样最终结构会动态捕获任何内部嵌套字段,并且我会得到 11 行此布局:

Record Type.NA Max.NA  Type.Land Max.Land  Type.Dcon  Max.Dcon   Type.Finish Max.Finish
1      NA       NA       NA         NA         NA     NA         NA          NA
...
4      NA       NA       Land       60%        Dcon   70%        Finish      80%

我尝试过 jsonlite::fromJSON 和 do.call 的组合。

我可以从第一个列表开始,通过

lapply(extract$stage, jsonlite::fromJSON)

但我无法将其分散到多个列中。

谁能帮忙?

谢谢!

【问题讨论】:

    标签: r list dataframe jsonlite


    【解决方案1】:

    自行解决,而不是靠运气:

    lapply(extract$stage, jsonlite::fromJSON) -> ex1
    do.call(bind_rows, lapply(ex1, unlist)) -> ex2
    ex2
    

    ...虽然很高兴看到有人有更好的解决方案!

    【讨论】:

      猜你喜欢
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      • 2021-12-21
      • 2020-02-21
      • 2019-07-08
      相关资源
      最近更新 更多