#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.