Как объединить фреймы данных в R без дублирования исходных значений данных

#r #join #row-number

#r #Присоединиться #номер строки

Вопрос:

У меня есть 2 фрейма данных ( DF1 amp; DF2 ), и 1 хотел бы объединить их с помощью уникального значения под названием "acc_num" . В DF2 оплата была произведена дважды с помощью acc_num A и трижды с помощью B . Фреймы данных следующие.

DF1:

  acc_num     total_use    sales
    A           433        145
    A            NA          2
    A            NA         18
    B           149         32
  

DF2:

    acc       payment   
    A           150
    A            98
    B            44
    B            15
    B            10
  

Мой желаемый результат:

  acc_num    total_use    sales    payment
    A            433       145       150
    A             NA         2        98
    A             NA        18        NA
    B            149        32        44
    B             NA        NA        15
    B             NA        NA        10
  

Я пробовал full_join и merge , но результат был не таким, как хотелось. Я не смог разобраться с этим, поскольку я все еще новичок в R и не нашел решения для этого.

Пример кода, который я использовал, был

 test_full_join <- DF1 %>% full_join(DF2, by = c("acc_num" = "acc"))
  

Отображаемый результат был:

  acc_num       total_use   sales     payment
    A             433       145        150
    A             433       145         98
    A              NA         2        150
    A              NA         2         98
    A              NA        18        150
    A              NA        18         98
    B             149        32         44
    B             149        32         15
    B             149        32         10
  

Это противоречит моему желаемому результату в конце,
моя задача — получить общую сумму total_use , sales и payment .
Этот вывод определенно даст мне неправильную интерпретацию
для последующей визуализации данных.

Комментарии:

1. Оба набора данных имеют дубликаты для ‘acc_num’

2. Сначала суммируйте все требуемые столбцы по acc_num (т. Е. Создайте по одной записи на acc_num элемент) и затем объедините

Ответ №1:

Возможно, нам потребуется выполнить объединение с помощью row_number() на основе ‘acc_num’

 library(dplyr)
df1 %>%
     group_by(acc_num) %>%
     mutate(grpind = row_number()) %>% 
     full_join(df2 %>% 
                   group_by(acc_num = acc) %>%
                   mutate(grpind = row_number())) %>%
     select(acc_num, total_use, sales, payment)
# A tibble: 6 x 4
# Groups:   acc_num [2]
#  acc_num total_use sales payment
#  <chr>       <int> <int>   <int>
#1 A             433   145     150
#2 A              NA     2      98
#3 A              NA    18      NA
#4 B             149    32      44
#5 B              NA    NA      15
#6 B              NA    NA      10
  

данные

 df1 <- structure(list(acc_num = c("A", "A", "A", "B"), total_use = c(433L, 
NA, NA, 149L), sales = c(145L, 2L, 18L, 32L)), class = "data.frame",
   row.names = c(NA, 
-4L))

df2 <- structure(list(acc = c("A", "A", "B", "B", "B"), payment = c(150L, 
98L, 44L, 15L, 10L)), class = "data.frame", row.names = c(NA, 
-5L))