Сравните столбцы из двух фреймов данных и свяжите строки из df2 в df1 при сопоставлении - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь найти способ сравнения двух фреймов данных, логика c для сравнения части ниже, пример для первого фрейма данных (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

Лог c для сравнения этих двух фреймов данных:

  1. Сравнение столбца gst_invoice_no из df1 с invoice_number из df2, если есть совпадение cbind строка от df2 до df1;

  2. Если совпадений нет, сравните тот же столбец gst_invoice_no из df1 с номером shipment_number из df2, если есть совпадение, cbind строка из df2 в df1.

Я считаю, что мой предыдущий вопрос был немного ошеломляющим. Пожалуйста, предложите способ достижения первых двух шагов.

1 Ответ

2 голосов
/ 14 апреля 2020

Вы можете получить df2 в длинном формате, сохраняя invoice_number и shipment_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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...