【问题标题】:How to find common rows between two dataframe in R?如何在 R 中的两个数据框之间找到共同的行?
【发布时间】:2015-10-03 01:11:49
【问题描述】:

我想制作一个新的数据框,它只包含两个单独的 data.frame 的公共行。 示例:

data.frame 1

1 id300
2 id2345
3 id5456
4 id33
5 id45
6 id54

data.frame2

1 id832
2 id300
3 id1000
4 id45
5 id984
6 id5456
7 id888

所以我希望我的输出是:

1 id300
2 id45
3 id5456

有什么建议吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    这里合适的dplyr 函数是inner_join(返回df x 中与df y 匹配的所有行。)

    library(dplyr)
    inner_join(df1, df2)
    
          V1
    1  id300
    2 id5456
    3   id45
    

    注意:这些行按照它们在df1 中的顺序返回。如果你做了inner_join(df2, df1),id45 会在id5456 之前。

    【讨论】:

    • 是否可以从df1中删除交集?
    • 是的,我想你会使用anti_join(df1, df2)。详情请查看函数文档。
    【解决方案2】:
    common <- intersect(data.frame1$col, data.frame2$col)  
    data.frame1[common,] # give you common rows in data frame 1  
    data.frame2[common,] # give you common rows in data frame 2
    

    【讨论】:

    • 我也喜欢dplyrs intersect(分包)
    • 我认为这个答案没有正确回答问题。它甚至不能推广到具有两列或更多列的 data.frames。
    • 同意@raymkchow。对于每个数据帧只有一列的特定示例效果很好,但如果有一个更通用的解决方案会很好
    • 当心intersect!如果您碰巧在两个数据框中都显示了某个值两次,那么您只会返回其中一个行。您可能想要也可能不想要这种效果。
    【解决方案3】:

    使用merge

    new_data_frame <- merge(data.frame1, data.frame2)
    

    我假设您在每个数据框中只有一列,并且它们在两个框架中具有相同的名称。如果不用by.x = "nameCol1" 和by.y = "nameCol2" 使用要与之相交的列,其中nameCol 是真正的列名。

    在第一次评论后添加
    如果您在任何数据框中有更多列,则该命令是相同的。这样做:

    >a  #Data frame 1
          c1 c2
    1  id300  6
    2 id2345  5
    3 id5456  4
    4   id33  3
    5   id45  2
    6   id54  1
    
    > b #Data frame 2
         a  f
    1  asd 12
    2 id33 10
    3 id45  8
    4 id54  6
    

    如您所见,它们不共享列名,并且每列有 2 列。所以:

    > merge(a,b, by.x = "c1", by.y = "a")
    
        c1 c2  f
    1 id33  3 10
    2 id45  2  8
    3 id54  1  6
    

    剩下的唯一行是在所选列中具有相同条目的行。

    【讨论】:

    • 如果我在第二个数据框中有不止一列,并且如果我希望它们出现在新数据框中,那么我应该如何更改此命令?
    【解决方案4】:

    在将data.frame 转换为data.table 之后,我们也可以使用fintersect 从data.table 执行此操作

    library(data.table)
    fintersect(setDT(df1), setDT(df2))
    #       v1
    #1:  id300
    #2:   id45
    #3: id5456
    

    数据

    df1 <- structure(list(v1 = c("id300", "id2345", "id5456", "id33", "id45", 
    "id54")), .Names = "v1", class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5", "6"))
    
    df2 <- structure(list(v1 = c("id832", "id300", "id1000", "id45", "id984", 
    "id5456", "id888")), .Names = "v1", class = "data.frame", row.names = c("1", 
    "2", "3", "4", "5", "6", "7"))
    

    【讨论】:

    • 如何对单个数据框中的多个列执行相同操作?我有 37 列长度不等...
    • @krushnachChandra 不清楚您的问题。您是否想从单个 data.frame 中获取相交。然后做Reduce(intersect, df1)
    【解决方案5】:

    为此,您应该在两个数据框中分配行名,然后在 R 中使用 intersect 进行处理。这可以通过以下命令实现:

    intersect(dataframe.1$V1,dataframe.2$V2)
    

    【讨论】:

      【解决方案6】:

      使用dplyr包的intersect函数

      1. 安装这个包

      2. 像这样使用这个函数

        var_name

      最好的一点是它也可以与字符一起使用,而 merge 和 inner_join 不能给出结果 您也可以使用此功能查看他们在数据集上的位置

      for (i in (no. of duplicates ) ) {
       for (j in ( no. of rows in other dataset  ) ) {
        if (new[i] == ac$variable_name[j]) {
        print(j)
        }
        } 
      }
      

      【讨论】:

        猜你喜欢
        • 2021-11-20
        • 1970-01-01
        • 2013-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多