【问题标题】:Is there a way to do a merge with one table and if not found with the second table?有没有办法与一个表合并,如果没有找到第二个表?
【发布时间】:2020-03-27 14:12:43
【问题描述】:
df1 <- data.frame(id=c(1,2,3,4,5,8), var=c("a","b","c","d","e","t"), stringsAsFactors = F)
df2 <- data.frame(id=c(1,2,3,4,5,6,7), var=c("e","f","c","d","e","g","h"), stringsAsFactors = F)
df <- data.frame(id=c(1,2,3,4,5,6,7,8))

我需要加入以获取 df 的 var 值,但我想要 df2 而不是 df1 的 var 值,如果 df2 中没有等价物,那么我想从 df1 中获取它。我有这个,但有没有更简单的方法来做到这一点?以及如何添加一列以查看 var 的来源?

df %>% left_join(df1, by="id") %>% left_join(df2, by="id") %>%
  dplyr::mutate(var=ifelse(!is.na(var.x), var.x, var.y))

【问题讨论】:

  • 你的方法很好(而且,我认为,很简单!)。我会在最后一步推荐var = coalesce(var.x, var.y)

标签: r merge dplyr


【解决方案1】:

首先在df1df2 上使用bind_rows,如果设置了参数.id,您可以看到var 的来源。

library(dplyr)

bind_rows(df1 = df1, df2 = df2, .id = "from") %>% 
  distinct(id, .keep_all = T) %>%
  right_join(df)

#   from id var
# 1  df1  1   a
# 2  df1  2   b
# 3  df1  3   c
# 4  df1  4   d
# 5  df1  5   e
# 6  df2  6   g
# 7  df2  7   h
# 8  df1  8   t

【讨论】:

    【解决方案2】:

    我们可以像这样使用 SQL 三重连接:

    library(sqldf)
    sqldf("select a.*, coalesce(b.var, c.var) as var
     from df a
     left join df1 b using(id)
     left join df2 c using(id)")
    

    给予:

      id var
    1  1   a
    2  2   b
    3  3   c
    4  4   d
    5  5   e
    6  6   g
    7  7   h
    8  8   t
    

    如果需要放入管道:

    df %>%
        { sqldf("select a.*, coalesce(b.var, c.var) as var
         from [.] a
         left join df1 b using(id)
         left join df2 c using(id)") }
    

    【讨论】:

      猜你喜欢
      • 2017-12-11
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      • 2019-12-30
      • 2021-07-01
      • 2014-10-13
      • 2016-08-29
      相关资源
      最近更新 更多