2013-04-29 201 views
1

我有一個json數據文件,其中包含我想要使用的數據。它看起來就像這樣:將列表數組轉換爲表

[ 
{"key1":1,"key2":2,"key3":[123],"key4":{"345":1}}, 
{"key1":2,"key2":4,"key3":[246],"key4":{"980":2},"key5":50} 
] 

我使用的包rjson和RJSONIO(到目前爲止,他們給了相同的結果),讀它,這是我的了:

> json_file = "~/Documents/test.json" 
> test_json = fromJSON(paste(readLines(json_file, warn = FALSE), collapse = "")) 
> test_json 
[[1]] 
[[1]]$key1 
[1] 1 

[[1]]$key2 
[1] 2 

[[1]]$key3 
[1] 123 

[[1]]$key4 
345 
    1 


[[2]] 
[[2]]$key1 
[1] 2 

[[2]]$key2 
[1] 4 

[[2]]$key3 
[1] 246 

[[2]]$key4 
980 
    2 

[[2]]$key5 
[1] 50 

> summary(test_json) 
    Length Class Mode 
[1,] 4  -none- list 
[2,] 5  -none- list 

所以,如果我理解這一點正確的,我有一個列表數組。但是由於這個數組顯然具有相同的鍵,我想將它轉換爲一個表,以便我可以執行諸如test_json $ key1之類的操作。我怎樣才能做到這一點?

(我希望我很清楚自己想要做什麼,我對R很陌生,不知道所有正確的條款,我也不想讓你做這個工作對於我來說,但我懷疑可能有這樣的情況的內置函數,或者如果沒有,就建議我應該在什麼方向移動會很好)。

回答

1

其實,你擁有的是一個列表清單。 (R中的數組是多維矩陣。)表格實際上也是指某種特定的東西(參見?table)。你可能想要的是一個數據幀

作爲第一步,嘗試:

lapply(test_json,as.data.frame) 
[[1]] 
    key1 key2 key3 X345 
1 1 2 123 1 

[[2]] 
    key1 key2 key3 X980 key5 
1 2 4 246 2 50 

,這將給你的數據幀的列表。但在這一點上,你有一個小問題。數據框每個都有不同的列數。如果他們都有相同的列,我們可以簡單地做:

do.call(rbind,lapply(test_json,as.data.frame)) 

你會得到一個大數據幀。作爲替代方案,你可以使用rbind.fillplyr包:

do.call(rbind.fill,lapply(test_json,as.data.frame)) 
    key1 key2 key3 X345 X980 key5 
1 1 2 123 1 NA NA 
2 2 4 246 NA 2 50 

需要這將填補遺漏值與NA。

我應該補充說,當我試圖讀取你使用rjson的例子時,有些東西變得有點怪異。我不知道爲什麼(編輯沒錯,試圖與RJSONIO和它匹配您的輸出。顯然,他們不同偶爾),但我的答案應該仍然適用,即使我結束了一些亂碼列。

+0

謝謝,它看起來完全像我想要的!唯一的區別是我發現gtools包中的smartbind功能更適合我的需求。 – 2013-04-29 14:14:23