Преобразование текстового поля JSON с неравной глубиной вложения в фрейм данных - PullRequest
0 голосов
/ 03 октября 2019

Я пытаюсь преобразовать столбец в извлечении данных в data.frame

Допустим, в таблице extract, у меня есть столбец extract$stage типа: символ , первые 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)

, но я не могу разложить это на несколько столбцов.

Может кто-нибудь помочь?

Спасибо!

1 Ответ

0 голосов
/ 03 октября 2019

Самостоятельно решил, скорее по счастливой случайности:

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

... хотя рад видеть, есть ли у кого-нибудь более аккуратное решение!

...