json - R:将具有空元素的嵌套列表转换为 data.frame(来自 json)

标签 json r list dataframe

我已经导入了一个像这样的 json 文件:

library(rjson)
json_str <- '[{"id": 1, "code": 7909, "text": [{"col1": "a", "col2": "some text"}], "date": "2015-12-01"}, {"id": 2, "code": 7651, "text": [], "date": "2015-12-01"}, {"id": 3, "code": 4768, "text": [{"col1": "aaa", "col2": "Blah, blah"}, {"col1": "bbb", "col2": "Blah, blah, blah"}], "date": "2015-12-01"}]'
my.list <- fromJSON(json_str)
str(my.list)

不用说真正的文件要长得多。

结果我得到一个包含 3 个元素的嵌套列表,其中每个元素都是一个包含 4 个元素的列表,然后,元素 $text 是一个可变长度的列表,从无到任意数量的元素,就我而言,通常不超过 3 个。

经过一些研究,我找到了几个关于将 list 转换为 data.frame 的答案,例如 herehere .但是,当“$text”中的一个或多个嵌套列表为空时,它们都不起作用。

do.call(rbind, lapply(my.list, data.frame, stringsAsFactors=FALSE))

library(data.table)
rbindlist(my.list, fill=TRUE)

两者都返回错误。

我想将 $text 中的列表转换为 data.frame 的多列或只是一列(粘贴内容)。

另一种选择是能够跳过一些元素(例如 $text)并转换列表的其余部分,然后在单独的一行中转换这些元素(例如 $text) 到不同的 data.frame。我想我可以以某种方式将一个 data.frame 与另一个联系起来。

任何人都可以告诉我如何做到这一点。 谢谢

最佳答案

听上去,像下面这样的东西应该可以工作:

do.call(rbind.data.frame, lapply(my.list, function(x) {
    x[["text"]] <- toString(unlist(x[["text"]]))
    x
}))
##    id code                                   text       date
## 2   1 7909                           a, some text 2015-12-01
## 21  2 7651                                        2015-12-01
## 3   3 4768 aaa, Blah, blah, bbb, Blah, blah, blah 2015-12-01

这遵循您将值粘贴在一起(此处使用 toString)以在 data.frame 中形成单个列的想法。

关于json - R:将具有空元素的嵌套列表转换为 data.frame(来自 json),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34312914/

相关文章:

Python 嵌套列表条目与父列表共享内存地址

javascript - 将 $.getJSON 对象传递给另一个 ember Controller

jQuery getJSON 在本地工作,但不能跨域

r - 将数据帧列中的负值更改为绝对值

R Shiny - 在 Shiny 模块中插入动态 UI

R:更改单元格中的值,如果其上方和下方的值彼此匹配,而不使用 for 循环

javascript - 不使用 Ajax 从 header 加载 JSON 文件

java - 如何通过 Google Cloud Datastore JSON API 存储带有子类的类?

r - 如何更有效地将巨大的向量列表转换为矩阵?

vb.net - 简化 vb.net 中的列表初始化