我有一个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
我找到了这种解析我的JSON的简单方法:
unlisted_data <- lapply(fromJSON(json_str), function(x){unlist(x)})
data.frame(do.call("rbind", unlisted_data))
但是,unlist
进程会将重复的值分散到多个列中:
id p11 p12 p13 p2
1 A 1 2 3 foo
2 B 4 5 6 bar
我希望使用unlist
选项调用recursive = FALSE
可以解决这个问题,但事实并非如此。
我注意到我可以几乎使用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"
答案 0 :(得分:2)
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