【发布时间】:2021-08-27 11:03:36
【问题描述】:
我有一个包含电子邮件列表的数据框,其中一些位于 NA。数据框有一个 ID 列,没有 NA。
前几天我得到了一些包含一些新信息的数据。它是一个包含新电子邮件信息和相应 ID 的数据框。
我希望将此添加到我的电子邮件列表中。起初,我认为使用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.
【问题讨论】: