我有一个
JSON数据源,它是一个对象列表.一些对象属性本身就是列表.我想将整个事物转换为数据帧,将列表保留为数据帧值.
示例JSON数据:
[{
"id": "A",
"p1": [1, 2, 3],
"p2": "foo"
},{
"id": "B",
"p1": [4, 5, 6],
"p2": "bar"
}]
期望的数据框:
id p2 p1
1 A foo 1, 2, 3
2 B bar 4, 5, 6
尝试失败1
我找到了解析我的JSON这种非常直接的方法:
unlisted_data <- lapply(fromJSON(json_str), function(x){unlist(x)})
data.frame(do.call("rbind", unlisted_data))
但是,未列出的进程会在多个列中传播我重复的值:
id p11 p12 p13 p2
1 A 1 2 3 foo
2 B 4 5 6 bar
我期望使用recursive = FALSE选项调用unlist会处理这个问题,但事实并非如此.
尝试失败2
我注意到我几乎可以使用I函数执行此操作:
> data.frame(I(parsed_json[[1]]))
parsed_json..1..
id A
p1 1, 2, 3
p2 foo
但是行和列是相反的.转置结果会破坏重复的数据:
> t(data.frame(I(parsed_json[[1]])))
id p1 p2
parsed_json..1.. "A" Numeric,3 "foo"
最佳答案 jsonlite包可以处理这个很好:
library(jsonlite)
fromJSON(txt)
# id p1 p2
#1 A 1, 2, 3 foo
#2 B 4, 5, 6 bar
fromJSON(txt)$p1
#[[1]]
#[1] 1 2 3
#
#[[2]]
#[1] 4 5 6