Есть ли способ сделать слияние с одной таблицей и, если не найден со второй таблицей? - PullRequest
2 голосов
/ 27 марта 2020
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))

Мне нужно объединиться, чтобы получить значение var для df, но я бы хотел, чтобы значение var для df2, а не df1, и если в 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))

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Сначала используйте bind_rows на df1 и df2, и вы можете видеть, откуда взялась var, если задан аргумент .id.

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
0 голосов
/ 27 марта 2020

Мы можем использовать тройное соединение 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)") }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...