Как я могу работать с этим вложенным форматом JSON в R? - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь работать с вложенным форматом JSON, подобным приведенному ниже.В конечном счете мне нужно, чтобы во фрейме данных было только две строки данных: одна для Джона и одна для Сэма, а остальные данные в формате, как показано ниже.Таким образом, этот конкретный фрейм данных будет иметь 2 строки и 7 столбцов.

Name  RD1  RD2  Hours1  Hours2  Billable1  Billable2
John
Sam

Как это можно сделать?Заранее спасибо!

Вот код:

library(jsonlite)
options(stringsAsFactors = FALSE)
    rawData <- "document.txt"
    processedData <- fromJSON(rawData, flatten = TRUE)
    processedData <- processedData[, c("name", "records")]
    unnestedJSON <- unnest(processedData, records)

document.txt содержит эту информацию:

[
{
  "name": "John",
  "records": [
     {
        "reportDate": "2018-07-20",
        "hours": 204,
        "billable": 32844
     },
     {
        "reportDate": "2018-03-25",
        "hours": 234,
        "billable": 37715
     }
  ]
},
{
  "name": "Sam",
  "records": [
     {
        "reportDate": "2018-06-18",
        "hours": 187,
        "billable": 13883
     },
     {
        "reportDate": "2018-04-02",
        "hours": 176,
        "billable": 13467
     }
  ]
}
]

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Вы имеете в виду что-то подобное?

jsonlite::fromJSON(s, flatten=TRUE) %>%
  tidyr::unnest()
#   name reportDate hours billable
# 1 John 2018-07-20   204    32844
# 2 John 2018-03-25   234    37715
# 3  Sam 2018-06-18   187    13883
# 4  Sam 2018-06-19   188    13884
# 5  Sam 2018-06-20   189    13885
# 6  Sam 2018-04-02   176    13467

Мне было трудно сделать это как прямой data.table в общем виде (не зная столбцов заранее), см. Для справки https://stackoverflow.com/a/34693087/3358272 (здесь не работает) и https://github.com/Rdatatable/data.table/issues/2146.


Вспомогательные данные с добавлением нескольких записей:

s <- '[
{
  "name": "John",
  "records": [
     {
        "reportDate": "2018-07-20",
        "hours": 204,
        "billable": 32844
     },
     {
        "reportDate": "2018-03-25",
        "hours": 234,
        "billable": 37715
     }
  ]
},
{
  "name": "Sam",
  "records": [
     {
        "reportDate": "2018-06-18",
        "hours": 187,
        "billable": 13883
     },
     {
        "reportDate": "2018-06-19",
        "hours": 188,
        "billable": 13884
     },
     {
        "reportDate": "2018-06-20",
        "hours": 189,
        "billable": 13885
     },
     {
        "reportDate": "2018-04-02",
        "hours": 176,
        "billable": 13467
     }
  ]
}
]'
0 голосов
/ 24 февраля 2019

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

Вот вариант с data.table:

library(data.table)
dt <- data.table(unnestedJSON)
dt[, .(RD1 = first(reportDate), 
       RD2 = last(reportDate),  
       Hours1 = first(hours)
       Hours2 = last(hours)
       Billable1 =first(billable) 
       Billable2 = last(billable)), by = name]

Если ваши именане уникальны, вам нужно сначала создать столбец ID и агрегировать по ID.

Примечание: это должно работать с вашим примером с двумя значениями на имя.Если в имени json может быть больше значений, это может не соответствовать вашим требованиям.

Для поддержки более двух значений в имени используйте dcast:

library(data.table)
dt <- data.table(unnestedJSON)
dt[, rown := 1:.N, by = name]
res <- dcast(
  dt, 
  formula = name ~ rown, 
  value.var = c("reportDate", "hours", "billable"), fun.aggregate = mean)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...