我有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"
答案 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\" }"