Ответ 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
.