【问题标题】:Rbind two dataframes, where columns are not arranged in same format?Rbind两个数据框,其中列的排列格式不同?
【发布时间】:2018-06-26 14:03:15
【问题描述】:

我有两个数据框,比如我需要 rbind 的 df1 和 df2。

DF1 如下所示:

a   b   c
1   11  21
2   12  22
3   13  23

DF2 如下所示:

b   a   d
14  4   31
15  5   32
16  6   33

a,b,c,d 是列名。

我想要的输出如下:

a   b   c   d
1   11  21  31
2   12  22  32
3   13  23  33
4   14      
5   15      
6   16      

现在,我试试

最终

这可以在 r 中完成吗?

【问题讨论】:

  • data.table::rbindlist(list(df1, df2), use.names = TRUE, fill = TRUE)
  • 当“a”为 1:3 时,您的输出显示“d”值,但这不应该是强制转换,因为第二个数据集(具有“d”)具有“a”= 4:6。根据您的用例,您可能需要执行 data.table::merge() 以基于某些键列进行合并。 @d.b 建议的方法应该可以正常工作。

标签: r


【解决方案1】:

尝试gtools 包中的smartbind() 函数。它可用于组合具有不同列的数据集。

【讨论】:

    【解决方案2】:
    NM = unique(c(names(df1), names(df2)))
    mylist = setNames(lapply(NM, function(nm) c(df1[[nm]], df2[[nm]])), NM)
    data.frame(lapply(mylist, function(x) x[1:max(lengths(mylist))]))
    #  a  b  c  d
    #1 1 11 21 31
    #2 2 12 22 32
    #3 3 13 23 33
    #4 4 14 NA NA
    #5 5 15 NA NA
    #6 6 16 NA NA
    

    也试试

    merge(df1, df2, all = TRUE)
    

    data.table::rbindlist(list(df1, df2), use.names = TRUE, fill = TRUE)
    

    数据

    df1 = structure(list(a = 1:3, b = 11:13, c = 21:23), .Names = c("a", 
    "b", "c"), class = "data.frame", row.names = c(NA, -3L))
    
    df2 = structure(list(b = 14:16, a = 4:6, d = 31:33), .Names = c("b", 
    "a", "d"), class = "data.frame", row.names = c(NA, -3L))
    

    【讨论】:

      【解决方案3】:

      我推荐dplyr 包中的bind_rows

      library(dplyr)
      bind_rows(df1, df2)
      

      这很简单,dplyr 是一个包含很多实用程序的包,因此您应该能够为任何项目挤出比这个单一功能更多的用途。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多