2013-08-28 91 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 
相关问题