R: Добавление столбца из одного набора данных в другой на основе сопоставления нескольких столбцов - PullRequest
0 голосов
/ 31 октября 2019

У меня есть два набора данных:

DS1 - содержит список субъектов со столбцами для имени, идентификационного номера и статуса занятости

DS2 - содержит один и тот же список имен субъектов и идентификационных номеровно некоторые из них отсутствуют во втором наборе данных.
Наконец, он содержит 3-й столбец для уровня образования.

Я хочу объединить столбец «Образование» с первым набором данных. Я сделал это с помощью функции объединения с сортировкой по номеру идентификатора, но поскольку во втором наборе данных отсутствуют некоторые идентификаторы, я хочу объединить оставшийся уровень образования по имени в качестве дополнительного параметра. Есть ли способ сделать это с помощью dplyr / tidyverse?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2019

Второй вариант в ответе временного программиста для меня. Огромное спасибо. Пришлось поэкспериментировать с моими фактическими наборами данных, но базовая структура работала очень хорошо, и ее было легко адаптировать

0 голосов
/ 31 октября 2019

Есть два способа сделать это. Выберите тот, который соответствует вашим предпочтениям.

1-й вариант:

#here I left join twice and select columns each time to ensure there is no duplication like '.x' '.y'
finalDf = DS1 %>% 
  dplyr::left_join(DS2 %>% 
                     dplyr::select(ID,EducationLevel1=EducationLevel),by=c('ID')) %>% 
  dplyr::left_join(DS2 %>% 
                     dplyr::select(Name,EducationLevel2=EducationLevel),by=c('Name')) %>% 
  dplyr::mutate(FinalEducationLevel = ifelse(is.na(EducationLevel1),EducationLevel2,EducationLevel1))

2-й вариант:

#first find the IDs which are present in the 2nd dataset

commonIds = DS1 %>% 
  dplyr::inner_join(DS2 %>% 
                      dplyr::select(ID,EducationLevel),by=c('ID'))

#now the records where ID was not present in DS2

idsNotPresent = DS1 %>% 
  dplyr::filter(!ID %in% commonIds$ID) %>% 
  dplyr::left_join(DS2 %>% 
                     dplyr::select(Name,EducationLevel),by=c('Name'))

#bind these two dfs to get the final df

finalDf = bind_rows(commonIds,idsNotPresent)

Дайте мне знать, если это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...