Обработка данных во вложенном файле json с несколькими объектами - PullRequest
0 голосов
/ 06 января 2020

У меня есть это подмножество моего JSON файла "json" в R

library(jsonlite)
json <- '{"year": {"2015":{"id": 10, "number": 1, "amount": 5},"2016": {"id": 2, "number": 6, "amount": 9}}}'
data1 <- jsonlite::fromJSON(json)
v<-as.data.frame(data1)
v

, который выглядит так

  year.2015.id year.2015.number year.2015.amount year.2016.id year.2016.number year.2016.amount
1           10                1                5            2                6                9

Но я хочу только последний объект, который имеет переменные "id", "number", "amount". Таким образом, требуемый вывод будет выглядеть следующим образом.

id  number amount
10  1    5
2   6    9

Как мне добиться этого, когда файл json вложен, и я хочу посмотреть только на уровень, где данные имеют переменную id год и число а не на уровне с годом.

С наилучшими пожеланиями, Кристиан Скёт

Ответы [ 2 ]

2 голосов
/ 06 января 2020

Вы можете использовать library(jqr) для подмножества самого json, а затем построить data.frame после того, как вы извлекли нужные значения

jqr::jq( json, '.[][]') %>%
  jqr::combine() %>%
  jsonlite::fromJSON()

#   id number amount
# 1 10      1      5
# 2  2      6      9
2 голосов
/ 06 января 2020

Проблема возникает, когда вы автоматически преобразуете список списка данных в фрейм данных, вам нужно получить доступ к списку данных фрейма data1 $ year вместо data1 и затем связать данные.

Подготовка данных

library(jsonlite)

json <- 
  '{"year": {"2015":{"id": 10, "number": 1, "amount": 5},"2016": {"id": 2, "number": 6, "amount": 9}}}'

data1 <- jsonlite::fromJSON(json)

Метод связывания 1

do.call("rbind", data1$year)
# id number amount
# 2015 10 1      5     
# 2016 2  6      9   

Метод связывания 2 с использованием dplyr

dplyr::bind_rows(data1$year, .id = NULL)
# # A tibble: 2 x 3
# id number amount
# <int>  <int>  <int>
# 10      1      5
# 2      6      9

Метод связывания 3 с использованием plyr

plyr::ldply(data1$year, data.frame, .id = NULL)
# # A tibble: 2 x 3
# id number amount
# <int>  <int>  <int>
# 10      1      5
# 2      6      9
...