【问题标题】:Compare columns from two dataframe and cbind the rows from df2 to df1 when matching比较来自两个数据框的列,并在匹配时将 df2 中的行 cbind 到 df1
【发布时间】:2020-04-14 02:31:08
【问题描述】:

我正在尝试寻找一种方法来比较两个数据帧,下面是比较部分的逻辑,例如第一个数据帧 (df1)

order   billing_doc  gst_invoice_no
2321    938456847    GT8476534
7465    943758465    HG3485634
3475    253426365    GT3475634
2534    215431233    HY8347534

第二个文档示例 (df2)

order_number    shipment_number   invoice_number    final_status
3347            28I4Y348843       GT36543265        Delivered
2376            WEKRUH32343       234U652763        Dispatched
2732            93745874654       HT35426343        Invoiced
5434            34598749R43       HY32562343        Delivered
2344            WUTR7635632       HU35642653        Packed
2331            2343234IUY4       FER3542542        Cancelled

比较这两个数据框的逻辑是:

  1. 将 df1 中的 gst_invoice_no 列与 df2 中的 invoice_number 进行比较,如果匹配,则将 df2 中的行绑定到 df1;

  2. 如果没有匹配,则将 df1 中的同一列 gst_invoice_no 与 df2 中的 shipping_number 进行比较,如果匹配,则将 df2 中的行绑定到 df1。

我相信我之前的问题有点压倒性。请提出一种实现前两个步骤的方法。

【问题讨论】:

    标签: r dataframe merge


    【解决方案1】:

    您可以得到df2 的长格式,将invoice_numbershipment_number 保持在同一列中,然后进行连接。

    library(dplyr)
    
    df1 %>%
      left_join(df2 %>%
                  tidyr::pivot_longer(cols = c(invoice_number, shipment_number), 
                               values_to = 'gst_invoice_no'), by = 'gst_invoice_no')
    

    对于更大的数据集,我们可以使用data.table

    library(data.table)
    setDT(df2)
    setDT(df1)
    
    df3 <- df1[melt(df2, measure.vars = c('shipment_number', 'invoice_number'), 
         value.name = "gst_invoice_no"), on = 'gst_invoice_no']
    
    df3[, .SD[1L], gst_invoice_no]
    

    【讨论】:

    • 嗨,我收到此错误:“错误:无法分配大小为 553.6 Mb 的向量另外:警告消息:列gst_invoice_no 加入因子和字符向量,强制转换为字符向量”
    • 谢谢你成功了。但问题是我在 df2 中有多个 df1 值,这会在 df1 中创建重复项,有没有一种方法可以让我们找到找到的第一个匹配项,然后将该行从 df2 绑定到 df1 ?
    • 我们可以为每个gst_invoice_no 选择第一行。检查更新是否有帮助。
    猜你喜欢
    • 1970-01-01
    • 2020-09-08
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    相关资源
    最近更新 更多