我正在尝试使用类似于下面的嵌套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
}
]
}
]
答案 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)