如何在R中使用此嵌套JSON格式?

时间:2019-02-24 18:39:36

标签: r json dataframe nested

我正在尝试使用类似于下面的嵌套JSON格式。我最终需要的是数据帧仅包含两行数据,一行用于John,另一行用于Sam,另一行数据的格式如下。因此,此特定数据帧将具有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 :(得分:1)

你的意思是这样吗?

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。 / p>


支持数据,并添加了一些条目:

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
     }
  ]
}
]'

答案 1 :(得分:0)

您只需要将数据聚合到名称级别(假设每个名称都是唯一的)。

这是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)