1

我有一个 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 很陌生,不知道所有正确的术语。我也不是暗示要你为我做这项工作,但是我怀疑在这种情况下可能有一个内置函数,或者如果没有,只是建议我应该朝哪个方向移动会很好)。

4

1 回答 1

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))

你会得到一个大数据框。作为替代方案,您可以rbind.fillplyr包中使用:

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的示例时,有些东西有点奇怪。我不知道为什么(编辑是的,尝试使用RJSONIO并且它与您的输出匹配。显然它们偶尔有所不同。),但我的答案仍然适用,即使我最终得到了一些乱码的列。

于 2013-04-29T13:56:21.157 回答