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

标签 json r dataframe type-conversion

我有一个 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 源行进入数据帧以及哪些行被拒绝,那就更好了,这样结果就只有实际需要的列和行。

最佳答案

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

关于json - R列表(结构(列表()))到数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12508986/

相关文章:

php - Disqus API 添加评论

正则表达式删除单词,如果它在 R 中同时多次包含字母/特殊字符

php - 为什么 Vue 不读取我通过 PHP 作为 Prop 传递的整个 JSON 对象?

r - 处理程序中的错误$add(处理程序,键,尾部): Key/already in use with Shiny

javascript - Highcharts 中 3D 条形图的不同深度

python - 如何拆分数据框并将其存储在 Excel 文件的多个工作表中

python - 连接日期列

python - 使用 pandas 获取列的当前最大值并输入到新列中

javascript - 根据JSON信息定位HTML div

android - 如何从一个 JSONObject 获取值到另一个 JSONObject