Как я могу объединить, чтобы обновить два dfs с одинаковыми именами col?

#r #dataframe #dplyr

Вопрос:

У меня есть фрейм данных, содержащий список электронных писем, некоторые из которых находятся в NA. В кадре данных есть столбец идентификатора и нет NA. На днях я получил некоторые данные с некоторой новой информацией. Это фрейм данных с новой информацией об электронной почте и соответствующими идентификаторами. Я надеюсь добавить это в свой список электронной почты. Сначала я подумал, что использование full_join() или left_join() было бы хорошим способом сделать это. Но таким образом, добавленный столбец электронной почты распознается как новый столбец. Я не хочу добавлять новую колонку, я хочу обновить колонку электронной почты. Есть ли простое решение для этого? Чтобы показать эту ситуацию простым способом, я генерирую следующие данные.

список адресов электронной почты:

 > email_df <- tibble(
    id = 1:10,
    email = rnorm(10, 1000, 10)  # Here, each number is an individual e-mail address.
  )
> email_df[c(1,3,5,7,9), 2] <- NA  # These lines are missing values.
> email_df
# A tibble: 10 x 2
      id email
   <int> <dbl>
 1     1   NA 
 2     2 1000.
 3     3   NA 
 4     4  989.
 5     5   NA 
 6     6 1011.
 7     7   NA 
 8     8 1000.
 9     9   NA 
10    10  987.
 

новая информация:

 > new_infomation <- tibble(
    id = c(1,3,5,7),
    email = rnorm(4, 1000, 10)
  )
> new_infomation
# A tibble: 4 x 2
     id email
  <dbl> <dbl>
1     1  990.
2     3 1006.
3     5 1007.
4     7 1009.
 

плохое решение:

 > full_join(email_df, new_infomation, by = "id")
# A tibble: 10 x 3
      id email.x email.y
   <dbl>   <dbl>   <dbl>
 1     1     NA     990.
 2     2   1000.     NA 
 3     3     NA    1006.
 4     4    989.     NA 
 5     5     NA    1007.
 6     6   1011.     NA 
 7     7     NA    1009.
 8     8   1000.     NA 
 9     9     NA      NA 
10    10    987.     NA 
 

Конечно, эти данные можно исправить следующим образом, но мне кажется, что они слишком многословны.

 > full_join(email_df, new_infomation, by = "id") %>% 
    mutate(
      email = ifelse(!is.na(email.x), email.x, email.y)
    ) %>% 
    select(id,email)
# A tibble: 10 x 2
      id email
   <dbl> <dbl>
 1     1  990.
 2     2 1000.
 3     3 1006.
 4     4  989.
 5     5 1007.
 6     6 1011.
 7     7 1009.
 8     8 1000.
 9     9   NA 
10    10  987.
 

Ответ №1:

rows_update dplyr здесь можно использовать функцию from.

 library(dplyr)

email_df %>% rows_update(new_infomation, by = 'id')

#      id email
#   <int> <dbl>
# 1     1  984.
# 2     2 1008.
# 3     3  997.
# 4     4  997.
# 5     5  990.
# 6     6 1001.
# 7     7 1006.
# 8     8 1008.
# 9     9   NA 
#10    10 1000.