Индивидуальное сопоставление двух фреймов данных по идентификатору - PullRequest
1 голос
/ 15 марта 2019

Я хочу объединить эти две таблицы по их идентификатору и сопоставить соответствующее количество (однозначно)

df1 <- data.frame(id=c("101","101","101", "102","102","102","102"),
               authno=c("A", "B", "C","A", "B", "C", "D"),
               amount=c(1083, 1329, 1083, 1330, 1330, 1330, 140))

df2 <- data.frame(id=c("101","101","101","102", "102","102","102"),
               amount=c(1329, 833, 1083, 1330, 1330, 1700, 120))

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

id  authno amount
101  A  1083
101  B  1328
101  C  NA
102  A  1330
102  B  1330
102  C  NA
102  D  NA

Обратите внимание, что поскольку в df2 имеется только 1 строка с id == 101 & amount == 1083, будет совпадать только первая строка, соответствующая этому (authno == A), в то время как второй экземпляр (authno == C) получает NA. Поскольку в df2 есть 2 строки с id == 102 & amount == 1330, authno A и B могут совпадать, а C - нет.

1 Ответ

2 голосов
/ 15 марта 2019

Представьте, что может быть более эффективный способ сделать это, но dplyr может справиться с этим:

library(dplyr)
df1 %>% 
  group_by(id, amount) %>% 
  arrange(authno) %>%
  mutate(row = row_number()) %>% 
  left_join(df2 %>% 
              group_by(id, amount) %>% 
              mutate(row = row_number(),
                     present_in_both = TRUE)) %>% 
  ungroup() %>% 
  mutate(amount = if_else(is.na(present_in_both),
                          NA_real_,
                          amount)) %>% 
  select(-present_in_both, -row)

Как видите, я группирую id и amount в каждом кадре данных, а затем добавляю фиктивный идентификатор группировки как row. left_join будет соответствовать всем id, amount и row. В вашем случае id == 101 & amount == 1083 происходит дважды в df1, но только один раз в df2, так что эта настройка разрешит совпадение только один раз!

Далее мы удаляем amount, если в left_join не было совпадений (помечено present_in_both. Наконец, мы удаляем две фиктивные переменные row и present_in_both.

Что дает:

  id    authno amount
  <fct> <fct>   <dbl>
1 101   A        1083
2 101   B        1329
3 101   C          NA
4 102   A        1330
5 102   B        1330
6 102   C          NA
7 102   D          NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...