2013-08-28 141 views
5

我想從api的json數據將列表轉換爲data.frame。使用來自JSON的,我得到一個嵌套的列表結構,並且我需要在其他一些數據框上加入這些數據。將多個列表元素轉換爲單獨的data.frame列

因此,該列表是多維(嵌套)。我一直試圖將多個元素轉換爲data.frame中的單獨列,因爲它們與其他框架的結構匹配並進行連接。我確信有這樣一個優雅的方式,但我似乎沒有找到一個。在最壞的情況下,我最終可能會使用作爲循環。

任何幫助將不勝感激!!!!

這裏是樣本數據來創建列表:

mylist <- list(structure(list(
     categoryName = "cat1", 
     parent_categories = "parent1", 
     url = "/xyx.com/bca/"), 

     .Names = c("categoryName", "parent_categories", "url")), 

     structure(list(
     categoryName = "cat2", 
     parent_categories = c("parent2", "parent3", "parent4"), 
     url = "/abc.com/bca"), 

     .Names = c("categoryName", "parent_categories", "url")) 
    ) 

我想應該是這樣的

categoryName parent_categories_1 parent_categories_2 parent_categories_3 url 
1   cat1   parent1   NA   NA     /xyx.com/bca/ 
2   cat2   parent2   parent3  parent4   /abc.com/bca 

下面的輸出是我用什麼,但沒有得到期望的結果,儘管其非常接近

ldply(mylist, function(x){ data.frame(x) }) 

    **MY CURRENT OUTPUT** 

     categoryName parent_categories   url 
    1   cat1   parent1 /xyx.com/bca/ 
    2   cat2   parent2 /abc.com/bca 
    3   cat2   parent3 /abc.com/bca 
    4   cat2   parent4 /abc.com/bca 

回答

4

這裏有一個方法,但我敢肯定有一個更好的方法:

mylist2 <- lapply(lapply(mylist, unlist), function(x) { 
    names(x)[names(x) == "parent_categories"] <- "parent_categories1" 
    data.frame(t(x)) 
}) 

library(plyr) 
rbind.fill(mylist2) 

## categoryName parent_categories1   url parent_categories2 parent_categories3 
## 1   cat1   parent1 /xyx.com/bca/    <NA>    <NA> 
## 2   cat2   parent2 /abc.com/bca   parent3   parent4 

說明:

  1. unlist每個嵌套列表爲載體列表
  2. 我重新命名「 parent_categories「改爲」parent_categories1「僅適用於只有一個父類別的人
  3. 我使用plyrrbind.fill將其拼接乙醚

您可以使用幾種方法重新排列列順序,但這是相當直接的。

+0

感謝您的快速響應!這似乎有伎倆。其實我沒有意識到在我的ldply中使用** Transpose **。否則,我可以通過逗號或類似的方式拆分列字符串。 –

1

這似乎有點更直接對我說:

  1. meltlist
  2. 添加一個「時間」變量,以確保在熔融data.frame
  3. 使用dcast L1和L2的獨特組合,以獲取您的寬格式data.frame

library(reshape2) 
x <- melt(mylist) 
x$time <- with(x, ave(L2, L1, L2, FUN = seq_along)) 
dcast(x, L1 ~ L2 + time, value.var="value") 
# L1 categoryName_1 parent_categories_1 parent_categories_2 parent_categories_3   url_1 
# 1 1   cat1    parent1    <NA>    <NA> /xyx.com/bca/ 
# 2 2   cat2    parent2    parent3    parent4 /abc.com/bca 
相關問題