【问题标题】:Combine two lists in a dataframe in R在R中的数据框中组合两个列表
【发布时间】:2015-04-22 04:38:50
【问题描述】:

我有两个结构不同的列表:

listA <- list(c("a","b","c"), c("d","e"))
listB <- list(0.05, 0.5)

listA
[[1]]
[1] "a" "b" "c"

[[2]]
[1] "d" "e"

listB
[[1]]
[1] 0.05

[[2]]
[1] 0.5

我知道如何使用循环将两个列表组合在一个数据框中,如下所示,但我确信有一种更有效的方法。

data.frame(A = c("a","b","c","d","e"), B = c(rep(0.05,3), rep(0.5,2)))
  A    B
1 a 0.05
2 b 0.05
3 c 0.05
4 d 0.50
5 e 0.50

【问题讨论】:

    标签: r list merge dataframe


    【解决方案1】:

    这是另一种选择:

    do.call(rbind, Map(data.frame, A=listA, B=listB))
    
    #   A    B
    # 1 a 0.05
    # 2 b 0.05
    # 3 c 0.05
    # 4 d 0.50
    # 5 e 0.50
    

    【讨论】:

      【解决方案2】:

      也许有一种更优雅的方式可以保留 numeric 的类 list2 的元素...但是这个也可以

      df <- do.call(rbind,mapply(cbind, listA, listB))
      df <- as.data.frame(df, stringsAsFactors = FALSE)
      df[,2] <- as.numeric(df[,2])
      

      编辑更好的是 Matthew Plourde 的解决方案使用 Map aka mapply(data.frame, A=listA, B=listB, SIMPLIFY = FALSE)

      【讨论】:

        【解决方案3】:

        不使用do.call的另一种方式:

        cbind(data.frame(listA), data.frame(listB))
        

        【讨论】:

          【解决方案4】:

          我更喜欢这个:

          do.call(rbind,
                  Map(function(...) setNames(cbind.data.frame(...), 
                                             c("A", "B")), 
                      listA, listB))
          #  A    B
          #1 a 0.05
          #2 b 0.05
          #3 c 0.05
          #4 d 0.50
          #5 e 0.50
          

          【讨论】:

            【解决方案5】:

            如果寻找tidyverse 解决方案,这里是接受答案的类似物。在map 函数系列中使用dfr 后缀可以实现非常简单的解决方案,该解决方案也应该比do.call("rbind") 更快。

            library(tidyverse)
            listA <- list(c("a","b","c"), c("d","e"))
            listB <- list(0.05, 0.5)
            
            map2_dfr(listA, listB, ~ tibble(A = .x, B = .y))
            #> # A tibble: 5 x 2
            #>   A         B
            #>   <chr> <dbl>
            #> 1 a      0.05
            #> 2 b      0.05
            #> 3 c      0.05
            #> 4 d      0.5 
            #> 5 e      0.5
            

            reprex package (v0.2.1) 于 2019-02-12 创建

            【讨论】:

            • 最好的解决方案,因为没有丑陋的行名!
            【解决方案6】:

            这是另一种方式:

            do.call(rbind,
                    lapply(1:length(listA),
                           function(i)
                             data.frame(A=unlist(listA[i]),
                                        B=unlist(listB[i]))))
            

            【讨论】:

              【解决方案7】:

              这会适当地放置索引并重命名列:

              df <- do.call(rbind.data.frame, Map('c', listA, listB))
              colnames(df)[1] <- "A"
              colnames(df)[2] <- "B"
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2018-05-20
                • 2015-08-26
                • 2013-05-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2020-10-16
                • 2018-09-20
                相关资源
                最近更新 更多