#r #dataframe
Вопрос:
У меня есть df1 с 820 строками:
ID College Score Score3
EI01 0 1 2
EI01 0 1 6
EI08,EI07 1 4 4
EI08,EI07 1 4 8
EI02 0 0 9
EI05 1 2 2
EI06 1 10 12
У меня есть df2 с 713 строками:
ID Points
EI01 20
EI08,EI07 12
EI02 30
EI04 10
Я попытался объединить эти два df по «идентификатору» со всеми=FALSE, но мой новый объединенный df составляет 864 строки, в то время как я хотел бы, чтобы он составлял не более 820 строк, учитывая # в df1. Я хотел бы знать, что я делаю не так. Кроме того, я хотел бы создать df3, который включает в себя все идентификаторы в df1, которых нет в df2.
Комментарии:
1. Пожалуйста, приведите воспроизводимый пример.
2. как? Они состоят из 800 рядов. Я попытался привести примеры приведенных выше данных
3. Точно такой же пример, как вы показали выше, в воспроизводимом формате, который можно скопировать в R.
4. Работает ли это?
dplyr::left_join(df1,df2)
?5. Пожалуйста, покажите точный код, который вы пробовали. Кроме того, если вы хотите сохранить все идентификаторы
df1
, которые вы должны использоватьall.x = TRUE
вместоall = FALSE
.
Ответ №1:
Если вы хотите объединить данные и провести автоматическую проверку качества, вы можете рассмотреть возможность использования tidylog
пакета, который заменяет многие dplyr
функции более подробными.
Вот пример tidylog::left_join()
с вашими образцами данных:
> left_join(df1,df2)
Joining, by = "ID"
left_join: added one column (Points)
> rows only in x 2
> rows only in y (1)
> matched rows 5
> ===
> rows total 7
ID College Score Score3 Points
1: EI01 0 1 2 20
2: EI01 0 1 6 20
3: EI08,EI07 1 4 4 12
4: EI08,EI07 1 4 8 12
5: EI02 0 0 9 30
6: EI05 1 2 2 NA
7: EI06 1 10 12 NA
Чтобы найти идентификаторы, которые входят df1
и не входят df2
, вы можете использовать:
df1 %>%
filter(!ID %in% df2$ID) %>%
pull(ID)
[1] "EI05" "EI06"
Комментарии:
1. Есть ли способ также получить вывод всех идентификаторов из df1, которых нет в df2
2. @Эван, да, я обновил ответ.