2015-12-16 75 views
3

我已經進口這樣一個JSON文件:R:用空元素轉換嵌套列表data.frame(從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個

經過一番研究,我發現關於轉換listdata.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與另一個相關聯。

任何人都可以給我任何想法如何做到這一點。 感謝

+0

謝謝@ ananda-mahto,避免了錯誤。然而,你不會得到'data.frame'而是'matrix'。我正在嘗試在你的代碼中加入data.frame部分。 – eindzl

+0

對不起,我的瀏覽器不會刷新。 – eindzl

回答

1

通過它的聲音,像下面應該工作:

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一列。

+0

這樣做的工作。只需添加'data.frame'位。 (x)[ - [text]] - toString(unlist(x [[「text」]])); data.frame(x) }))' 再次感謝@ ananda-mahto的迅速反應。 – eindzl