【问题标题】:If column2 is NA join on column1 else join on column1 and column2如果 column2 是 NA 加入 column1 否则加入 column1 和 column2
【发布时间】:2019-03-14 20:28:58
【问题描述】:

我确信这个问题以前被问过,但我一生都找不到答案。我想使用 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 

【问题讨论】:

  • 我认为您需要使用anyif(any(is.na(df2$y2)) 进行包装。顺便说一句,当您仅通过“x”列加入时,如果数据集“x”都有重复元素,则会导致重复行

标签: r dplyr left-join


【解决方案1】:

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

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  

【讨论】:

  • @JennaAllen 我注意到您在接受答案后没有接受答案。您在寻找其他东西吗?
  • 不,抱歉。我在手机上看它,一定是不小心点击了它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-30
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
相关资源
最近更新 更多