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

War*_*ung 9 json r type-conversion dataframe

我有一个提供哈希列表的JSON数据源:

[
  { "a": "foo",
    "b": "sdfshk"
  },
  { "a": "foo",
    "b": "ihlkyhul"
  }
]
Run Code Online (Sandbox Code Playgroud)

fromJSON()rjson包中使用它将其转换为R数据结构.它返回:

list(
  structure(list(a = "foo", b = "sdfshk"), .Names = c("a", "b")),
  structure(list(a = "foo", b = "ihlkyhul"), .Names = c("a", "b"))
)
Run Code Online (Sandbox Code Playgroud)

我需要将其转换为R数据帧,但data.frame()将其转换为具有四列而不是预期的2x2数据帧的单行数据帧.我缺少R-fu来进行从一个到另一个的转换,尽管它看起来应该是直截了当的.

奖励积分:

实际问题有点复杂,因为JSON数据源不像我上面显示的那样规则.它返回的对象类型不同.也就是说,每个中设置的字段可以是几种不同类型之一:

[
  { "a": "foo",
    "b": "asdfhalsdhfla"
  },
  { "a": "bar",
    "c": "akjdhflakjhsdlfkah",
    "d": "jfhglskhfglskd",
  },
  { "a": "foo",
    "b": "dfhlkhldsfg"
  }
]
Run Code Online (Sandbox Code Playgroud)

如您所见,每个对象中的"a"字段是一个类型标记,指示该对象将具有哪些其他字段.

我不太讲解解决方案是如何应对的.

如果两个对象类型只是在一起形成,那就不会太可怕了,所以你得到列a,b,c和d,并且这些行只有jSON 源对象没有给定值的值N/ANULL值领域.我相信我可以清理生成的数据框subset(df, a == "foo").我会以这种方式结束一些空列,但这对我的程序来说无关紧要.

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

Rom*_*rik 10

如果你想要转换为data.frame的锯齿状列表,你可以使用Hadley的plyr's 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
Run Code Online (Sandbox Code Playgroud)