JSON到R数据框:保留重复的值

时间:2015-09-09 01:31:01

标签: json r

我有一个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))

但是,unlist进程会将重复的值分散到多个列中:

  id p11 p12 p13  p2
1  A   1   2   3 foo
2  B   4   5   6 bar

我希望使用unlist选项调用recursive = FALSE可以解决这个问题,但事实并非如此。

尝试失败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"

1 个答案:

答案 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