Как объединить DF-s в are с несколькими условиями?

#r #merge

#r #слияние

Вопрос:

У меня есть два DF, и я хочу объединить их, используя условия ссылки из двух разных столбцов. Используя «name» и «product_ID», я хочу добавить общее количество из второго DF в первый.

DF «Подробно»

 
Имя product_ID Сумма
Apple 011 5
Apple 11 10
Apple 011 20
Оранжевый 011 10
Оранжевый 011 5

Общие сведения о DF

 
Имя product_ID Итого
Apple 011 50
Apple 11 25
Оранжевый 011 20

Я хочу: DF подробно

 
Имя product_ID Сумма итого
Apple 011 5 50
Apple 11 10 25
Apple 011 20 50
Оранжевый 011 10 20
Оранжевый 011 5 20

Когда я бы использовал только 1 условие, я бы использовал деталь слияния <- merge(Detail, General[, C(«Name», «total»)], «Name», all.X=TRUE)

Я не знаю, как заставить его использовать как «Name», так и product_ID.

Я думал, что я мог бы также создать новый столбец, в который я добавляю «Name» и «product_ID» в один столбец, но я не знаю, как добавить два фактора вместе в отдельный столбец.

Надеюсь, вы сможете мне помочь

Ответ №1:

Вот tidyverse решение для вас, которое использует join вместо merge , но оно отлично справляется с задачей.

Ваш комбинированный подход действительно хорошая идея, если вы не хотите использовать tidyverse. Если ваш df имеет factor s вместо character s, как в этом решении, вы можете просто преобразовать их с помощью as.character

Обещанное решение:

 library(tidyverse)
  
  general <- read_table('Name   product_ID    Amount
Apple    011           5
Apple    11            10
Apple    011           20
Orange   011           10
Orange   011           5') 
  
  detail <- read_table('Name   product_ID    Total
Apple    011           50
Apple    11            25
Orange   011           20')
  
  df <- general %>% 
    full_join(detail)
#> Joining, by = c("Name", "product_ID")
  
  df
#> # A tibble: 5 x 4
#>   Name   product_ID Amount Total
#>   <chr>  <chr>       <dbl> <dbl>
#> 1 Apple  011             5    50
#> 2 Apple  11             10    25
#> 3 Apple  011            20    50
#> 4 Orange 011            10    20
#> 5 Orange 011             5    20
 

Создано 2021-03-12 пакетом reprex (версия 0.3.0)