将复杂的json转换为数据集

时间:2019-04-27 12:55:19

标签: r json

我在将复杂的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

3 个答案:

答案 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