首页 > 解决方案 > 如果 column2 是 NA 加入 column1 否则加入 column1 和 column2

问题描述

我敢肯定这个问题以前被问过,但我找不到我一生的答案。我想使用 dplyr 将两个 tibbles 连接在一起。如果第二列是 NA 则只需加入第一列。如果第二列不是 NA,则加入第一列和第二列。下面的解决方案不起作用,但这是我正在尝试做的。

library(tidyverse)
df1 <- tibble(x = c("Name", "City", "City"),  y = c("Table5", "Table1", "Table2"))
df2 <- tibble(x2 = c("Name", "City", "City"), y2 = c(NA, "Table1", "Table2"), z = c("a", "b", "c"))

joined_data <- if (is.na(df2$y2)) {
  df1 %>% 
    left_join(df2, by = c("x" = "x2"))
} else {
  df1 %>% 
    left_join(df2, by = c("x" = "x2", "y" = "y2")) 
}

最终结果应该是

  x     y      z    
  <chr> <chr>  <chr>
1 Name  Table5 a  
2 City  Table1 b    
3 City  Table2 c 

标签: rdplyrleft-join

解决方案


我们首先找到所有NA索引,然后将它们加入两个单独的调用中。对于非 NA 索引,我们将它们连接起来xy而对于 NA 索引,我们仅将它们连接起来,并在和使用x之间选择非 NA 值,然后将行绑定在一起。yy2coalesce

library(tidyverse)
NAinds <- is.na(df2$y2)

df1[!NAinds,] %>%
   left_join(df2, by = c("x" = "x2", "y" = "y2")) %>%
   bind_rows(df1[NAinds, ]  %>%
                 left_join(df2,  by = c("x" = "x2")) %>%
                 mutate(y = coalesce(y, y2)) %>%
                 select(-y2))


#   x     y      z    
# <chr> <chr>  <chr>
#1 City  Table1 b    
#2 City  Table2 c    
#3 Name  Table5 a  

推荐阅读