Как использовать левое соединение в пакете tidyverse, чтобы сопоставить только первое с несколькими разными переменными в двух dfs? - PullRequest
0 голосов
/ 08 апреля 2020

Скажите, что мне нужно 2 dfs

df_1 <- data_frame(dates = c(as.Date("2018-07-01"), as.Date("2018-06-01"), as.Date("2018-06-01"), as.Date("2018-06-01"), as.Date("2018-05-01")), x1 = c(10L, 11L, 21L, 21L, 13L), text1 = c("text a", "text b", "text c", "text d", "text e"))
df_2 <- data_frame(dates = c(as.Date("2018-07-01"), as.Date("2018-06-01"), as.Date("2018-05-01"), as.Date("2018-04-01")),x2 = c(10L, 21L, 22L, 23L),text2 = c("text aa", "text bb", "text cc", "text dd"))

Я знаю, что мог бы использовать функцию соединения в пакете plyr для сопоставления первой только с одной переменной

plyr::join(df_2, df_1, type = 'left', match = 'first', by = 'dates')

Но с 2 переменными, «даты» и «х», это вызовет ошибку:

plyr::join(df_2, df_1, type = 'left', match = 'first', by = c('dates' = 'dates', 'x2' = 'x1'))

Также я мог бы использовать left_join в dplyr с несколькими переменными

df_2 %>% 
  left_join(df_1, by = c('dates' = 'dates', 'x2' = 'x1'))

Но нет первого аргумента соответствия. Любая помощь, спасибо

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Нельзя, не напрямую, всегда возвращать несколько совпадающих комбинаций, используя операции соединения с dplyr. Если вам нужно только первое совпадение, вы можете сгруппировать по объединяемым переменным и использовать slice() во второй таблице перед объединением.

df_2 %>% 
  left_join(df_1 %>%
              group_by(dates, x1) %>%
              slice(1), by = c('dates' = 'dates', 'x2' = 'x1'))

# A tibble: 4 x 4
  dates         x2 text2   text1 
  <date>     <int> <chr>   <chr> 
1 2018-07-01    10 text aa text a
2 2018-06-01    21 text bb text c
3 2018-05-01    22 text cc NA    
4 2018-04-01    23 text dd NA    
0 голосов
/ 08 апреля 2020

Одно (довольно обманчивое) решение - переименовать столбец, который выдает ошибку, например,

colnames(df_1)[2] = "x2" 

, а затем сделать

plyr::join(df_2, df_1, type = 'left', match = 'first', by = c("dates", "x2"))

, что дает

       dates x2   text2  text1
1 2018-07-01 10 text aa text a
2 2018-06-01 21 text bb text c
3 2018-05-01 22 text cc   <NA>
4 2018-04-01 23 text dd   <NA>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...