5

我正在尝试将列表从 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
4

2 回答 2

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'srbind.fill把它拼接起来

您可以使用多种方法重新排列列顺序,但这很简单。

于 2013-08-28T19:53:54.340 回答
1

这对我来说似乎更简单一点:

  1. melt您的list
  2. 添加“时间”变量以确保熔体中 L1 和 L2 的独特组合data.frame
  3. 用于dcast获取宽格式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
于 2013-12-19T17:59:42.893 回答