繁体   English   中英

当两个数据帧的列和行不同时,left_join 和 rows_update 的 tidyverse 替代方案

[英]tidyverse alternative to left_join & rows_update when two data frames differ in columns and rows

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

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

条件 #1 和 #2 使left_join失败。 条件 #3 使rows_update失败。 所以我需要在两者之间做一些步骤,我想知道是否有更简单的解决方案来获得所需的 output。

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

并且所需的 output 将是:

  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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM