我在将复杂的JSON转换为数据集时遇到问题,例如:
[{
"dateTime": 1556368322971,
"eventName": "sampleEvent",
"vars": [{
"distance": 350,
"fuel" : 300,
"vehicleType": null
}]
}, {
"dateTime": 1556368322971,
"eventName": "sampleEvent",
"vars": [{
"distance": 360,
"fuel" : 290,
"vehicleType": "bus"
}]
}]
我已经在尝试使用方法:
result <- fromJSON(file = "./all.json")
json_file <- lapply(result, function(x) {
x[sapply(x, is.null)] <- NA
unlist(x)
})
但是问题是所有NULL值都丢失了。这是非常有问题的,因为当我将其转换为dataSet(matrix)时,所有值都完全混乱,并且没有不正确的空值。
我希望有一个看起来像这样的数据集:
dateTime | eventName | distance | fuel | vehicleType
1556368322971 | sampleEvent | 350 | 300 | NA
1556368322971 | sampleEvent | 360 | 290 | bus
答案 0 :(得分:4)
我们可以使用tidyr::unnest
library(tidyr)
result %>% unnest()
# dateTime eventName distance fuel vehicleType
#1 1.556368e+12 sampleEvent 350 300 <NA>
#2 1.556368e+12 sampleEvent 360 290 bus
library(jsonlite)
result <- fromJSON("all.json")
文件all.json
所在的位置
[{
"dateTime": 1556368322971,
"eventName": "sampleEvent",
"vars": [{
"distance": 350,
"fuel" : 300,
"vehicleType": null
}]
}, {
"dateTime": 1556368322971,
"eventName": "sampleEvent",
"vars": [{
"distance": 360,
"fuel" : 290,
"vehicleType": "bus"
}]
}]
答案 1 :(得分:3)
带有base R
的选项为
cbind(result[1:2], do.call(rbind, result$vars))
# dateTime eventName distance fuel vehicleType
#1 1.556368e+12 sampleEvent 350 300 <NA>
#2 1.556368e+12 sampleEvent 360 290 bus
答案 2 :(得分:3)
您还可以使用map
中的purrr
系列,并一次链接一次平整一个级别。只需注意purrr
的{{1}}和jsonlite
之间的冲突。
flatten