在R中,从列表中提取对象的一部分

17

我正在学习R语言,但是在从列表对象中提取元素方面遇到了困难。我已经将一个json文件解析成了R中的列表对象。但是我无法弄清楚如何从中提取各种json元素。以下是解析json后我的数据的简略外观:

 > #Parse data into R objects#
 > list.Json= fromJSON(,final.name, method = "C")
 > head(listJson,6)
[[1]]
[[1]]$contributors
NULL

[[1]]$favorited
[1] FALSE

...[truncating]...
[[5]]
[[5]]$contributors
NULL

[[5]]$favorited
[1] FALSE

我可以找出列表中其中一个对象的收藏数据

> first.object=listJson[1]
> ff=first.object[[1]]$favorited
> ff
[1] FALSE

但是我非常困惑如何提取列表中所有对象的收藏夹。我已经研究了sappily,这是正确的方法吗?我需要将上面的代码放入for...next循环中吗?


在R中,列表有点令人困惑。实际上,它们更类似于其他语言中的哈希映射/字典。请查看https://dev59.com/XXI-5IYBdhLWcg3wBjhR以获取一些见解。 - Wilduck
1
将JSON转换为data.frame可能很麻烦,特别是当一个对象到另一个对象的键不能保证相同时。我喜欢@Jeff Allen的答案,但是当你的缺失值是NULL而不是NA时要小心。(如果你使用的是RJSONIO,你可以使用fromJSON(..., nullValue = NULL)来控制默认值)。例如,当其缺失值为NULL时,sapply(listJson, "[[", "contributors")返回一个列表,但当其缺失值为'NA'时,它返回一个向量。 - lockedoff
1个回答

35

sapply函数将对列表中的每个元素应用某个函数。在您的情况下,您希望访问(嵌套)列表中的每个元素。 sapply当然可以胜任。例如,如果您想访问列表中每个元素的第一个子元素:

sapply(listJson, "[[", 1)
如果你想访问名为“favorited”的项目,你可以使用以下代码:
sapply(listJson, "[[", "favorited")

请注意,[ 操作符将获取你正在使用的列表的子集。因此当你访问 myList[1] 时,你仍然拥有一个列表,只是长度为1。然而,如果你引用 myList[[1]],你将获得列表中第一个位置的内容(可能是另一个列表,也可能不是)。因此,在sapply中你将使用 [[ 操作符,因为你想要访问列表的内容。


谢谢,理解R列表一直是一个挑战。最终我也能够使用for循环使其工作:t1=NULL for (i in 1:length(list.Json)) { check=list.Json[[i]]$favorited if(typeof(check)=="NULL"){ check=list(NULL) } t1=c(t1,check) } - Martin
2
这真是奇怪,但非常有用。 - kpierce8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接