【问题标题】:Merge and concatenate two data frames in R在 R 中合并和连接两个数据帧
【发布时间】:2015-03-20 00:52:25
【问题描述】:

我有两个数据框 A 和 B,看起来像:

firstDF:
col1 col2 id
A      1    2
B      5    3
C      6    4

secondDF:
col1 col2 id
A      1    2
E      15   5
F      16   6

Resultant DF:

col1 col2 id
A      1    2
B      5    3
C      6    4
E      15   5
F      16   6

生成的数据框必须包含来自两个数据框的所有行。如果存在具有相同 id 的行,则只能将其放入结果数据框中一次。

我尝试使用 rbind 函数,但它返回并合并了所有行。 我尝试使用条件 x.id=y.id 的合并函数,但创建的结果数据框有多个列,即 x.col1、y.col1、x.col2、y.col2 等。

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用merge() 来做到这一点。

    merge(df1, df2, by=c("col1", "col2", "id"), all.x=T, all.y=T)
    

    这由所有公共变量合并,将所有记录保存在任一数据框中。或者,您可以省略 by= 参数,R 将自动使用所有公共变量。

    正如评论中提到的@thelatemail,您可以选择使用all=T,而不是单独指定all.x=Tall.y=T

    【讨论】:

    • 我必须写下所有的列名?我有大约 20 列!
    • @user1692342:是否所有 20 个都出现在两个数据框中?我相信如果您省略 by= 参数,默认行为是使用所有公共变量。也许尝试一下,看看会发生什么。不过,您仍然需要all.xall.y
    • 合并成功,但是具有相同“id”的行重复
    • @user1692342:如果任一数据框中有重复的id 值,这是预期的,否则它没有意义,因为您正在合并id。如果需要,您可以对重复的 id 值进行子集化。使用subset(df, !duplicated(id))
    • @AlexA.- all=TRUE 是同时指定 all.x=TRUEall.y=TRUE 的简写
    【解决方案2】:

    您可以尝试sqldf 库。我不知道什么样的加入。 但它会是这样的:

    Result =sqldf("select a.col1, a.col2, a.id from firstDF as a join secondDF as b on a.id=b.id")
    

    或者

    X=rbind(firstDB, secondDB)
    

    然后使用unique 函数过滤掉重复项。

    【讨论】:

      【解决方案3】:

      使用 sqldf:

      library(sqldf)
      
      sqldf("select * from firstDF union select * from secondDF")
      

      请注意,联合会自动删除重复项。

      【讨论】:

        【解决方案4】:

        这可能不是最高效的答案,而是一种快速简便的方法——假设任何重复的行实际上都是完全重复的(即,对于 df1 中 col_1 = X 的任何行,如果存在df2 中 col_1 = X 的行,所有其他列在这两行之间也相同)- 将 rbind 并获得唯一的结果:

        > df1
          col_1 col_2 id
        1     A     1  2
        2     B     5  3
        3     C     6  4
        > df2
          col_1 col_2 id
        1     A     1  2
        2     E    15  5
        3     F    16  6
        > unique(rbind(df1, df2))
          col_1 col_2 id
        1     A     1  2
        2     B     5  3
        3     C     6  4
        5     E    15  5
        6     F    16  6
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-14
          • 2016-10-30
          • 2020-04-07
          • 1970-01-01
          • 1970-01-01
          • 2019-03-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多