r语言 - 当两个数据框在列和行上不同时,left_join & rows_update 的 tidyverse 替代方案



这里可能缺少*_join版本,但我有两个数据帧,其中

  1. 合并应该发生在第一个数据帧中,因此left_join
  2. 我不仅想添加列,还想更新第一个数据帧中的现有列,更具体地说:用第二个数据帧的值替换第一个数据框中的NA
  3. 第二个数据帧包含比第一个数据帧更多的行

条件#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_joincoalesce来替换缺失的值。

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

最新更新