我有一个提供哈希列表的JSON数据源:
[
{ "a": "foo",
"b": "sdfshk"
},
{ "a": "foo",
"b": "ihlkyhul"
}
]
我在rjson
包中使用fromJSON()
将其转换为R数据结构。它返回:
list(
structure(list(a = "foo", b = "sdfshk"), .Names = c("a", "b")),
structure(list(a = "foo", b = "ihlkyhul"), .Names = c("a", "b"))
)
我需要将其转换为 R 数据帧,但是data.frame()
将其转换为具有四列而不是预期的2x2数据帧的单行数据帧。我没有R-fu来进行从一个到另一个的转换,虽然它看起来应该是直截了当的。
奖励积分:
实际问题有点复杂,因为JSON数据源并不像我上面所说的那样规则。它返回的对象类型不同。也就是说,每个中设置的字段可以是几种不同类型之一:
[
{ "a": "foo",
"b": "asdfhalsdhfla"
},
{ "a": "bar",
"c": "akjdhflakjhsdlfkah",
"d": "jfhglskhfglskd",
},
{ "a": "foo",
"b": "dfhlkhldsfg"
}
]
如您所见,每个对象中的“a”字段是一个类型标记,指示该对象将具有哪些其他字段。
我不太了解解决方案是如何应对的。
如果将两个对象类型混合在一起并不会很糟糕,那么您将获得列a,b,c和d,并且这些行只有N/A
或NULL
值JSON源对象没有给定字段的值。我相信我可以使用subset(df, a == "foo")
清理生成的数据框。我会以这种方式结束一些空列,但这对我的程序来说无关紧要。
如果解决方案提供了一种方法来选择哪些JSON源行进入数据框并被拒绝,那么结果会更好,因此结果只有实际需要的列和行。
答案 0 :(得分:10)
如果你有一个想要转换为data.frame的锯齿状列表,你可以使用Hadley的plyr rbind.fill
。几次拯救了我的脖子。如果这是您正在寻找的,请告诉我。请注意,我修改了您的第一个示例,在第三个元素中仅包含“b”以使其呈锯齿状。
> x <- list(
+ structure(list(a = "foo", b = "sdfshk"), .Names = c("a", "b")),
+ structure(list(a = "foo", b = "ihlkyhul"), .Names = c("a", "b")),
+ structure(list(b = "asdf"), .Names = "b")
+ )
>
> library(plyr)
> do.call("rbind.fill", lapply(x, as.data.frame))
a b
1 foo sdfshk
2 foo ihlkyhul
3 <NA> asdf