将R中的JSON读入data.frame

时间:2015-07-22 22:05:56

标签: json r

我有JSON值列表(实际上它是一个文本文件,其中每一行都是一个JSON对象)。像这样:

{ "id": 1, "name": "john", "age": 18, "education": "master" }
{ "id": 2, "name": "jack", "job": "clerk" }
...

某些值可能会丢失(例如,第一项没有“作业”值,第二项没有“教育”和“年龄”)。

我需要在R中创建数据框并将所有缺失的列填充为NAs(如果具有唯一名称的字段至少存在于一行中)。如何更轻松地实现这一目标?

我已经完成了 - 我安装了“rjson”软件包并将这些行解析为R列表。我们假设lines变量是行的字符向量。

library(rjson)
lines <- // initialize "lines" var here
jsons <- sapply(lines, fromJSON)

“jsons”变量变为“列表列表”(每个JSON对象在R术语中转换为列表)。如何将其转换为data.frame?

我希望看到我提供的示例的以下数据框:

"id" | "name" | "age" | "education" | "job"
-------------------------------------------
1    | "john" |  18   |  "master"   |   NA
2    | "jack  |  NA   |     NA      | "clerk"

2 个答案:

答案 0 :(得分:3)

plyr,您可以使用rbind.fill为您添加NA

library(plyr)
rbind.fill(sapply(jsons, data.frame), jsons)

#   id name age education   job
# 1  1 john  18    master  <NA>
# 2  2 jack  NA      <NA> clerk

或来自data.table

library(data.table)
rbindlist(jsons, fill=T)

dplyr

library(dplyr)
bind_rows(sapply(jsons, data.frame))

答案 1 :(得分:3)

未来我,纠正过我的错误。使用jsonlite&#39; s stream_in

会更有意义
stream_in(txtfile)

# To test on `txt` from below, try:
# stream_in(textConnection(txt))

# Found 2 records...
# Imported 2 records. Simplifying...
#  id name age education   job
#1 NA john  18    master  <NA>
#2  2 jack  NA      <NA> clerk

在对原始文本数据进行一些内联​​编辑后,使用jsonlite包的fromJSON功能(我还编辑了id的第一部分数据包含明确的null值,以表明它处理此问题:

fromJSON(paste0("[", gsub("}\n", "},\n", txt), "]"))
#  id name age education   job
#1 NA john  18    master  <NA>
#2  2 jack  NA      <NA> clerk

我所做的就是添加一些格式以将所有JSON行包装在[]中,并在每个结束}结束时添加一个逗号 - 从而产生输出如下所示,jsonlite::fromJSON可以同时处理所有内容:

[{"1":"one"},{"2":"two"}]

txt是您所显示的数据行,null变量中有id

txt <- "{ \"id\": null, \"name\": \"john\", \"age\": 18, \"education\": \"master\" }
{ \"id\": 2, \"name\": \"jack\", \"job\": \"clerk\" }"