Свернуть список JSON с вложенными структурами в единый data.frame

Я пытаюсь разобрать некоторые результаты из API. API возвращает результат JSON для заданного значения. API может обрабатывать только одно значение за раз, поэтому я lapply, чтобы получить все результаты. ‹- Если это плохая отправная точка, сделайте это лучше!

Каждый ответ JSON содержит вложенную информацию. Я пытаюсь собрать данные в один data.frame с разрешенной вложенной структурой.

Я играл с jsonlite и purrr большую часть дня, пытаясь заставить это работать и идеально устойчиво.

Как успешно преобразовать вложенную структуру json в data.frame для нескольких документов / записей json с помощью R?

MRE

library(jsonlite)
a <- LETTERS[1:5]
b <- letters[1:5]
c <- rep(data.frame(d=LETTERS[1:5]),5)

strSetup <- list(a, b, c)
dfSetup  <- data.frame(a, b, c)

jsonStr <- toJSON(rep(strSetup,3))

finalStr <- rbind(dfSetup,dfSetup,dfSetup)

Я пытаюсь перейти с jsonStr на finalStr.


person Steph Locke    schedule 16.02.2016    source источник
comment
Вы пробовали as.data.frame(fromJSON(jsonStr))? Он показывает 5 строк, 21 столбец, и я думаю, это то, что вам нужно.   -  person fishtank    schedule 16.02.2016
comment
Когда вы говорите, что API возвращает результат JSON для заданного значения., Вы имеете в виду, что он возвращает toJSON(strSetup) или toJSON(dfSetup)?   -  person Adam Hoelscher    schedule 16.02.2016
comment
@parfait, jsonStr предназначен для представления Json, который я получил в списке. Фактическое содержание будет слишком длинным.   -  person Steph Locke    schedule 16.02.2016
comment
@fishtail, к сожалению, помещает все как столбцы, не преобразовывая каждую запись Json в 5 строк и складывая их   -  person Steph Locke    schedule 16.02.2016
comment
@adam каждый вызов возвращает что-то вроде toJSON (strSetup)   -  person Steph Locke    schedule 16.02.2016
comment
Так должна ли строка 9 вашего примера кода быть jsonStr <- rep(toJSON(strSetup),3)?   -  person Adam Hoelscher    schedule 16.02.2016


Ответы (1)


Если я правильно понимаю, вы сохраняете все строки JSON, возвращаемые API, в вектор символов. Это означает, что строка 9 вашего примера немного не работает, и это должно сработать.

library(jsonlite)
a <- LETTERS[1:5]
b <- letters[1:5]
c <- rep(data.frame(d=LETTERS[1:5]),5)

strSetup <- list(a, b, c)
dfSetup  <- data.frame(a, b, c)

jsonStr <- rep(toJSON(strSetup),3)

finalStr <- rbind(dfSetup,dfSetup,dfSetup)

finalStr2 <- do.call(
  what = rbind,
  args = lapply(
    X = jsonStr,
    FUN = function(x){
      data.frame(fromJSON(x))
      }
    )
  )

print(all(finalStr == finalStr2))

Предостережение в том, что names(finalStr) != names(finalStr2). Однако я не думаю, что этого можно избежать, поскольку вы указали, что строка JSON, которую вы получаете от API, не содержит имен.

Если я неправильно понял, дайте мне знать.

person Adam Hoelscher    schedule 16.02.2016
comment
Он поступает в виде списка из-за lapply - каждый отдельный вызов возвращает объект json, и я перебирал элементы ввода, чтобы получить ответы. Но сейчас я придаю вашему коду вихрь - я должен иметь возможность зацикливаться на векторе, и если это облегчит жизнь, я полностью за это. - person Steph Locke; 16.02.2016
comment
Ok. Итак, вы используете lapply с FUN, равным функции, которая извлекает JSON из API? Можете ли вы обернуть unlist вокруг lapply, чтобы снова преобразовать его в вектор? - person Adam Hoelscher; 16.02.2016