R: стандартная оценка для * _join (dplyr)

Как присоединиться к 2 таблицам, используя * _join() из dplyr, когда имена переменных объединений различны и хранятся в другой переменной?

например.

df1 = data_frame(x1 = 1:10,y1 = 21:30)
df2 = data_frame(x2 = 6:15,y2 = 26:35)
df3 = data_frame(x1 = 6:15,y2 = 26:35)

var1 = "x1"
var2 = "x2"

df1 %>% left_join(df3,by=c(var1)) # #1 works

но это дает ошибку -

df1 %>% left_join(df2,by=c(var1 = var2)) # #2 doesn't work
Error: cannot join on columns 'x2' x 'var1': index out of bounds

удивительно, что это работает -

df1 %>% left_join(df2,by=c("x1" = var2)) # #3 works

Ответ 1

Проблема заключается в том, что вы должны указать именованный вектор, если общий столбец имеет разные имена в data.frames. Посмотрите, что происходит в вашем примере:

Он работает, когда вы напрямую указываете имена:

df1 %>% left_join(df2, by = c("x1" = "x2"))
#Source: local data frame [10 x 3]
#
#   x1 y1 y2
#1   1 21 NA
#2   2 22 NA
#3   3 23 NA
#4   4 24 NA
#5   5 25 NA
#6   6 26 26
#7   7 27 27
#8   8 28 28
#9   9 29 29
#10 10 30 30

И указанный вектор, который вы указываете:

c("x1" = "x2")
#  x1 
#"x2" 

Теперь, если вы используете символьные векторы, именованный вектор изменяется на:

var1 = "x1"
var2 = "x2"

c(var1 = var2)
#var1             # <~~ this is why it doesn't work
#"x2"

Я не знаю, есть ли "чистый" способ решить эту проблему в dplyr в настоящее время. Обходным решением является следующая настройка для создания названного вектора по мере необходимости:

df1 %>% left_join(df2, by = setNames(var2, var1))
#Source: local data frame [10 x 3]
#
#   x1 y1 y2
#1   1 21 NA
#2   2 22 NA
#3   3 23 NA
#4   4 24 NA
#5   5 25 NA
#6   6 26 26
#7   7 27 27
#8   8 28 28
#9   9 29 29
#10 10 30 30

Это работает, потому что:

setNames(var2, var1)
#  x1 
#"x2" 

Надеюсь, что это поможет.


Примечание: вы можете сделать то же самое с names<- следующим образом:

df1 %>% left_join(df2, by = `names<-`(var2, var1))

но Хэдли рекомендует использовать подход setNames.