【问题标题】:Convert multiple list elements to separate data.frame columns将多个列表元素转换为单独的 data.frame 列
【发布时间】:2013-08-28 19:32:34
【问题描述】:

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

【问题讨论】:

    标签: r


    【解决方案1】:

    这是一种方法,但我相信还有更好的方法:

    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拼接起来

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

    【讨论】:

    • 感谢您的快速回复!这似乎可以解决问题。实际上我没有意识到在我的 ldply 中使用 Transpose。否则我可以用逗号或类似的东西分割列字符串。
    【解决方案2】:

    这对我来说似乎更简单:

    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
    

    【讨论】:

      猜你喜欢
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 2018-11-21
      相关资源
      最近更新 更多