#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))