R列表(结构(列表()))到数据框

Posted

技术标签:

【中文标题】R列表(结构(列表()))到数据框【英文标题】:R list(structure(list())) to data frame 【发布时间】:2012-09-12 14:30:36 【问题描述】:

我有一个提供哈希列表的 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/ANULL 值,其中 JSON 源对象没有给定字段的值。我相信我可以用subset(df, a == "foo") 清理生成的数据框。这样我最终会得到一些空列,但这对我的程序无关紧要。

如果解决方案提供一种方法来选择哪些 JSON 源行进入数据框,哪些会被拒绝,那就更好了,这样结果就只有实际需要的列和行。

【问题讨论】:

【参考方案1】:

如果您想要将锯齿状列表转换为 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

【讨论】:

是的,加上subset() 完全符合我期望data.frame() 自动执行的操作。谢谢!

以上是关于R列表(结构(列表()))到数据框的主要内容,如果未能解决你的问题,请参考以下文章

将列表附加到R中的数据框

附代码 |详解R语言的高级数据结构

R基础:R语言数据结构1

R:根据列表元素名称创建新的数据框变量

组合列表中的向量以创建数据框 R [重复]

R语言数据结构与类型