我有一个json数据文件,其中包含我想要使用的数据。看起来像这样:
[
{"key1":1,"key2":2,"key3":[123],"key4":{"345":1}},
{"key1":2,"key2":4,"key3":[246],"key4":{"980":2},"key5":50}
]
我使用了包rjson和RJSONIO(到目前为止,它们给出了相同的结果)来阅读它,这是我得到的:
> json_file = "~/Documents/test.json"
> test_json = fromJSON(paste(readLines(json_file, warn = FALSE), collapse = ""))
> test_json
[[1]]
[[1]]$key1
[1] 1
[[1]]$key2
[1] 2
[[1]]$key3
[1] 123
[[1]]$key4
345
1
[[2]]
[[2]]$key1
[1] 2
[[2]]$key2
[1] 4
[[2]]$key3
[1] 246
[[2]]$key4
980
2
[[2]]$key5
[1] 50
> summary(test_json)
Length Class Mode
[1,] 4 -none- list
[2,] 5 -none- list
所以,如果我理解正确的话,我会得到一系列列表。但由于这个数组显然有相同的键,我想将它转换为表 - 所以我可以做像test_json $ key1这样的事情。我怎样才能做到这一点?
(我希望我很清楚我正在尝试做什么,我对R很新,并且不知道所有正确的条款。我也不暗示要求你做这项工作我,但我怀疑可能有类似情况的内置函数,或者如果没有,只是建议我应该朝哪个方向移动会很好。)
答案 0 :(得分:1)
实际上,你拥有的是列表清单。 (R中的数组是多维矩阵。)表格实际上也指特定的东西(见?table
)。您可能需要的是数据框。
作为第一步,尝试:
lapply(test_json,as.data.frame)
[[1]]
key1 key2 key3 X345
1 1 2 123 1
[[2]]
key1 key2 key3 X980 key5
1 2 4 246 2 50
将为您提供数据框列表。但此时你遇到了一个小问题。每个数据帧具有不同的列数。如果他们都有相同的列,我们可以简单地做:
do.call(rbind,lapply(test_json,as.data.frame))
然后你会得到一个大数据框。作为替代方案,您可以使用 plyr 包中的rbind.fill
:
do.call(rbind.fill,lapply(test_json,as.data.frame))
key1 key2 key3 X345 X980 key5
1 1 2 123 1 NA NA
2 2 4 246 NA 2 50
将根据需要用NA填充缺失值。
我应该补充一点,当我尝试用 rjson 读你的例子时,有些事情变得很糟糕。我不确定为什么(编辑 Yup,尝试使用 RJSONIO 并且它与您的输出匹配。显然他们做偶尔会有所不同。)但是我的答案应该仍然适用,即使我最终得到了一些乱码。