2012-07-17 94 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