【问题标题】:Merge 2 data frames by row and column overlap按行和列重叠合并 2 个数据帧
【发布时间】:2019-02-26 04:21:24
【问题描述】:

我想加法合并 2 个数据框,这样

      taxonomy A B C
1          rat 0 1 2
2          dog 1 2 3
3          cat 2 3 0

      taxonomy A D C
1          rat 0 1 9
2        Horse 0 2 6
3          cat 2 0 2

生产

      taxonomy A B C  D
1          rat 0 1 11 1
2        Horse 0 0 6  2 
3          cat 4 3 2  0
4          dog 1 2 3  0

我尝试过聚合、合并、应用、ddply....但没有成功...这将在 2 个具有几百行和列的数据帧上完成

【问题讨论】:

    标签: r dataframe merge


    【解决方案1】:

    你可以...

    > library(reshape2)
    > dcast(rbind(melt(DF1), melt(DF2)), taxonomy ~ variable, fun.aggregate = sum)
    Using taxonomy as id variables
    Using taxonomy as id variables
      taxonomy A B  C D
    1      cat 4 3  2 0
    2      dog 1 2  3 0
    3    Horse 0 0  6 2
    4      rat 0 1 11 1
    

    这会按字母顺序对行和列进行排序,但我想这可能可以通过使用 factor 来避免。

    数据:

    DF1 = structure(list(taxonomy = c("rat", "dog", "cat"), A = 0:2, B = 1:3, 
        C = c(2L, 3L, 0L)), .Names = c("taxonomy", "A", "B", "C"), row.names = c(NA, 
    -3L), class = "data.frame")
    DF2 = structure(list(taxonomy = c("rat", "Horse", "cat"), A = c(0L, 
    0L, 2L), D = c(1L, 2L, 0L), C = c(9L, 6L, 2L)), .Names = c("taxonomy", 
    "A", "D", "C"), row.names = c(NA, -3L), class = "data.frame")
    

    【讨论】:

      【解决方案2】:

      bind_rows 来自dplyr

      library(dplyr)
      
      bind_rows(df1, df2) %>%
        group_by(taxonomy) %>%
        summarize_all(sum, na.rm = TRUE)
      

      输出:

      # A tibble: 4 x 5
        taxonomy     A     B     C     D
        <chr>    <int> <int> <int> <int>
      1 cat          4     3     2     0
      2 dog          1     2     3     0
      3 Horse        0     0     6     2
      4 rat          0     1    11     1
      

      数据:

      df1 <- structure(list(taxonomy = c("rat", "dog", "cat"), A = 0:2, B = 1:3, 
          C = c(2L, 3L, 0L)), .Names = c("taxonomy", "A", "B", "C"), class = "data.frame", row.names = c("1", 
      "2", "3"))
      
      df2 <- structure(list(taxonomy = c("rat", "Horse", "cat"), A = c(0L, 
      0L, 2L), D = c(1L, 2L, 0L), C = c(9L, 6L, 2L)), .Names = c("taxonomy", 
      "A", "D", "C"), class = "data.frame", row.names = c("1", "2", 
      "3"))
      

      【讨论】:

        【解决方案3】:

        data.table 相当于 @avid_user 的答案。

        library(data.table)
        rbindlist(list(df1, df2), fill = TRUE)[, lapply(.SD, sum, na.rm = TRUE), by = taxonomy]
        #   taxonomy A B  C D
        #1:      rat 0 1 11 1
        #2:      dog 1 2  3 0
        #3:      cat 4 3  2 0
        #4:    Horse 0 0  6 2
        

        【讨论】:

        • 这应该也是最快的答案
        猜你喜欢
        • 2017-05-10
        • 2015-04-26
        • 1970-01-01
        • 1970-01-01
        • 2019-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多