【问题标题】:How to identify rows present in only one of the two datasets by comparing two of the common columns?如何通过比较两个公共列来识别仅存在于两个数据集中之一中的行?
【发布时间】:2021-12-13 15:21:04
【问题描述】:

我有两个列名相同的数据框,示例如下。

>dataframe1
   Company_name   Transaction_Code  Sum
1:    First             2000        234
2:    First             3000        562
3:    First             4000        105
4:   Second             8888        740
5:    Third             9000        325
6:    Third             4000        145
7:     BBB              1000         28
8:     BBB              3535        100
>dataframe2
   Company_name   Transaction_Code  Sum
1:    First             2000        340
2:    First             3000        620
3:    First             4000        050
4:   Second             8888        400
5:    Third             9000        250
6:    Third             4000        450
7:     BBB              1000         27

我正在尝试通过前两列的值检查条目,以查看 dataframe2 中缺少哪些来自 dataframe1 的条目。如图所示,dataframe1 具有 dataframe2 中缺少的条目 #8。我已经看到 dplyr::anti.join 解决方案适用于具有一个条件/列的此类任务,但是当我需要通过两列中的值来判断条目时,它似乎不起作用。

附:我没有包括任何可重现的例子,因为我没有看到任何意义。我远不是 R 或一般编码方面的专家,所以这个问题可能以某种方式缺乏,抱歉。

【问题讨论】:

  • Reprex 总是一个好主意。您可以通过运行dput(dataframe1)dput(dataframe2) 让人们更容易回答问题——这将为您提供创建对象所需的原始代码。否则,回答问题的人必须从头开始创建它们。

标签: r dataframe dplyr data-manipulation


【解决方案1】:

如果您指定要用于连接的列,这可以由 anti_join() 完成。

library(dplyr)
library(tibble)
dataframe1 = tribble(
  ~Company_name,  ~Transaction_Code,  ~Sum,
     "First",             2000,        234,
     "First",             3000,        562,
     "First",             4000,        105,
     "Second",            8888,        740,
     "Third",             9000,        325,
     "Third",             4000,        145,
     "BBB",               1000,         28,
     "BBB",               3535,        100
)

dataframe2 = tribble(
  ~Company_name,   ~Transaction_Code,  ~Sum,
      "First",             2000,        340,
      "First",             3000,        620,
      "First",             4000,        050,
      "Second",            8888,        400,
      "Third",             9000,        250,
      "Third",             4000,        450,
      "BBB",               1000,        27
)

anti_join(dataframe1, dataframe2, by = c("Company_name", "Transaction_Code"))

【讨论】:

    【解决方案2】:

    setdiff() 可能就是您要找的:

    df1 <- data.frame(company = c("first","first","first","second","third","third","BBB","BBB"),
                      transac = c(2000,3000,4000,8888,9000,4000,1000,3535),
                      sum=c(234,562,105,740,325,145,28,100))
    
    df2 <- data.frame(company = c("first","first","first","second","third","third","BBB"),
                      transac = c(2000,3000,4000,8888,9000,4000,1000),
                      sum=c(340,620,050,400,250,450,27))
    
    
    setdiff(df1[,1:2],df2[,1:2])
    

    返回

     company transac
    1     BBB    3535
    

    【讨论】:

    • 由于某种原因,它不包括第三列,就像 c_j_fairfield 的解决方案一样,但仍然指出了唯一的条目,谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多