将列表数组转换为表

时间:2013-04-29 13:16:35

标签: json r

我有一个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很新,并且不知道所有正确的条款。我也不暗示要求你做这项工作我,但我怀疑可能有类似情况的内置函数,或者如果没有,只是建议我应该朝哪个方向移动会很好。)

1 个答案:

答案 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 并且它与您的输出匹配。显然他们偶尔会有所不同。)但是我的答案应该仍然适用,即使我最终得到了一些乱码。