2012-07-17 52 views
14

我刚刚学习R,并且很难包围我的头部以便如何从列表中的对象中提取元素。我已经解析了一个JSON文件到R给我列表对象。但我无法弄清楚从那里,如何从列表中提取各种json元素。这里有一个截看看如何解析JSON后出现在我的数据:在R中,从列表中提取对象的一部分

> #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 

但我非常困惑如何为列表中的所有对象提取收藏。我已经开心地看着,这是正确的方法吗?我是否需要将上面的代码放到for ... next循环中?

+0

列表在R中有点令人困惑。它们实际上更类似于其他语言的hashmaps/dictionaries。看看http://stackoverflow.com/questions/2050790/how-to-correctly-use-lists-in-r得到一些见解。 – Wilduck 2012-07-17 20:25:56

+1

将JSON转换为'data.frame'可能会很痛苦,特别是如果从一个对象到下一个对象的键不能保证是相同的。我喜欢@Jeff Allen的回答,但是当你的缺失值是'NULL'而不是'NA'时要小心。 (如果你使用'RJSONIO',你可以使用'fromJSON(...,nullValue = NULL)'来控制默认值)。例如,'sapply(listJson,“[[”,“contributors”)'当其缺失值为'NULL'时返回一个列表,但当其缺失值为'NA'时返回一个向量。 – lockedoff 2012-07-17 21:36:24

回答

29

sapply将对列表中的每个元素应用一些函数。在你的情况下,你想访问(嵌套)列表中的每个元素。 sapply肯定能够做到这一点。例如,如果您要访问的每一个元素的第一个孩子在你的名单:

sapply(listJson, "[[", 1) 

或者,如果你想访问名为“收藏”的项目,你可以使用:

sapply(listJson, "[[", "favorited") 

[运营商将采取您正在使用的列表的子集。因此,当您访问myList[1]时,您仍然有一个列表,它只是长度为1.但是,如果您引用myList[[1]],则会获得列表中第一个空格的内容(可能是也可能不是另一个列表) 。因此,您将在sapply中使用[[运算符,因为您想要了解列表的内容。

+0

谢谢,让我的脑袋缠住R列表一直是一个挑战。我最终还能够通过for循环获得这个工作:t1 = NULL for(i in 1:length(list.Json)){ check = list.Json [[i]] $ favorited if(typeof(检查)==“NULL”){ check = list(NULL) } t1 = c(t1,检查) } – Martin 2012-07-18 23:35:53

+2

这很奇怪,但真的很有用 – kpierce8 2014-10-21 18:05:32