【问题标题】:R: Merge two data frames based on value in column and return all values of both data framesR:根据列中的值合并两个数据框并返回两个数据框的所有值
【发布时间】:2020-03-16 17:03:29
【问题描述】:

假设我有以下 dfs

df1:
a b c d
1 2 3 4
4 3 3 4
9 7 3 4

df2:
a b c d
1 2 3 4
2 2 3 4
3 2 3 4

现在我想合并列“a”的两个dfs条件来给我以下df

a b c d
1 2 3 4
4 3 3 4
9 7 3 4
2 2 3 4
3 2 3 4

在我的数据集中我尝试使用

merge <- merge(x = df1, y = df2, by = "a", all = TRUE)

但是,虽然 df1 有 50,000 个条目,而 df2 有 100,000 个条目,并且在 a 列中肯定有匹配的值,但合并后的 df 有超过一百万个条目。我不明白这个。据我了解,应该有最大值。合并的 df 中有 150,000 个条目,当两个 df 之间的 a 列中没有值相等时就是这种情况。

【问题讨论】:

  • 使用您在上面提供的示例数据集,该示例有效。这意味着它可能与您的数据集的格式/结构有关。 str(df1)str(df2) 的输出是什么?需要注意的一件事是,如果两个数据集中的列名相同,它将通过将.y 添加到第二个数据集中的列来生成新的列名。我假设这只是示例。

标签: r merge


【解决方案1】:

我认为您想要做的不是merge,而是rbind 两个数据框并删除duplicated 行:

数据

df1 <- data.frame(a = c(1,4,9),
                  b = c(2,3,7),
                  c = c(3,3,3),
                  d = c(4,4,4))
df2 <- data.frame(a = c(1,2,3),
                  b = c(2,2,2),
                  c = c(3,3,3),
                  d = c(4,4,4))

解决方案

行绑定df1df2

df3 <- rbind(df1, df2)

删除重复行:

df3 <- df3[!duplicated(df3), ]

结果

df3
  a b c d
1 1 2 3 4
2 4 3 3 4
3 9 7 3 4
5 2 2 3 4
6 3 2 3 4

【讨论】:

    【解决方案2】:

    有了tidyverse,我们可以做到bind_rowsdistinct

    library(dplyr)
    bind_rows(df1, df2) %>%
         distinct
    

    数据

    df1 <- structure(list(a = c(1, 4, 9), b = c(2, 3, 7), c = c(3, 3, 3), 
        d = c(4, 4, 4)), class = "data.frame", row.names = c(NA, 
    -3L))
    
    df2 <- structure(list(a = c(1, 2, 3), b = c(2, 2, 2), c = c(3, 3, 3), 
        d = c(4, 4, 4)), class = "data.frame", row.names = c(NA, 
    -3L))
    

    【讨论】:

      【解决方案3】:

      有可能

      dplyr::union(df1, df2)
      

      【讨论】:

        【解决方案4】:

        这是另一个使用rbind + %in% 的基本 R 解决方案

        dfout <- rbind(df1,subset(df2,!a %in% df1$a))
        

        这样

        > rbind(df1,subset(df2,!a %in% df1$a))
           a b c d
        1  1 2 3 4
        2  4 3 3 4
        3  9 7 3 4
        21 2 2 3 4
        31 3 2 3 4
        

        【讨论】:

          猜你喜欢
          • 2023-01-13
          • 1970-01-01
          • 1970-01-01
          • 2017-09-03
          • 2019-05-01
          • 2016-01-06
          • 1970-01-01
          相关资源
          最近更新 更多