这里可能缺少*_join版本,但我有两个数据帧,其中
- 合并应该发生在第一个数据帧中,因此left_join
- 我不仅想添加列,还想更新第一个数据帧中的现有列,更具体地说:用第二个数据帧的值替换第一个数据框中的NA
- 第二个数据帧包含比第一个数据帧更多的行
条件#1和#2使left_join
失败。条件#3使rows_update
失效。因此,我需要在两者之间做一些步骤,并想知道是否有更简单的解决方案来获得所需的输出。
x <- data.frame(id = c(1, 2, 3),
a = c("A", "B", NA))
id a
1 1 A
2 2 B
3 3 <NA>
y <- data.frame(id = c(1, 2, 3, 4),
a = c("A", "B", "C", "D"),
q = c("u", "v", "w", "x"))
id a q
1 1 A u
2 2 B v
3 3 C w
4 4 D x
并且期望的输出将是:
id a q
1 1 A u
2 2 B v
3 3 C w
我知道我可以用下面的代码来实现这一点,但对我来说,这看起来不必要地复杂。那么,有没有一种更直接的方法,而不必在下面的两个命令中执行中间管道呢?
library(tidyverse)
x %>%
left_join(., y %>% select(id, q), by = c("id")) %>%
rows_update(., y %>% filter(id %in% x$id), by = "id")
您可以使用left_join
和coalesce
来替换缺失的值。
library(dplyr)
x %>%
left_join(y, by = 'id') %>%
transmute(id, a = coalesce(a.x, a.y), q)
# id a q
#1 1 A u
#2 2 B v
#3 3 C w