将多个列表元素转换为单独的data.frame列

时间:2013-08-28 19:32:34

标签: r

我正在尝试将列表从api的json数据转换为data.frame。使用 fromJSON ,我得到一个嵌套的列表结构,我需要在其他一些数据帧上加入这些数据。

因此,列表有点多维(嵌套)。我一直在尝试将多个元素转换为data.frame中的单独列,因为它与其他框架的结构匹配并进行连接。我确信有一种优雅的方式可以做到这一点,但我似乎找不到一个。在最坏的情况下,我可能最终使用 for 循环。

任何帮助将不胜感激!!!!

以下是创建列表的示例数据:

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

2 个答案:

答案 0 :(得分: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. 我使用plyr的{​​{1}}将它拼接在一起
  4. 您可以使用多种方法重新排列列顺序,但这非常简单。

答案 1 :(得分:1)

这对我来说似乎更直接:

  1. melt您的list
  2. 添加“时间”变量以确保熔融data.frame
  3. 中L1和L2的唯一组合
  4. 使用dcast获取宽幅格式data.frame

  5. 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