Как проверить качество этих данных в R?

#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. @Эван, да, я обновил ответ.