2016-07-21 3 views
1

変数名の1つが関数の引数で定義されている関数内でdplyrを使用して2つのテーブルを結合しようとしています。他のdplyr関数では、通常、非標準的な評価に利用できるバージョンがあります。 select & select_,renameおよびrename_などであるが、_joinファミリーではない。私はthis answerを見つけましたが、私はそれが以下の私のコードで動作させることはできません。最後の試みが与える中にエラーdplyr関数内で2つのテーブルを結合します.1つの変数名は関数の引数です。

Error: 'gender' column not found in lhs, cannot join,

にエラーに

Error: 'sexvar' column not found in rhs, cannot join

を与える

df1 <- data.frame(gender = rep(c('M', 'F'), 5), var1 = letters[1:10]) 

new_join <- function(df, sexvar){ 

    df2 <- data.frame(sex = rep(c('M', 'F'), 10), var2 = letters[20:1]) 

    # initial attempt using usual dplyr behaviour: 
    # left_join(df, df2, by = c(sexvar = 'sex')) 

    # attempt using NSE: 
    # left_join(df, df2, 
    #   by = c(eval(substitute(var), list(var = as.name(sexvar)))) = 'sex')) 

    # attempt using setNames: 
    # left_join(df, df2, by = setNames(sexvar, 'sex')) 

} 

new_join(df1, 'gender') 

第一及び第二の試み

少なくともそれは私が列genderを望んでいることを示していますが、何とかそれは列の見出しとしては見ません。

誰かが間違っていると指摘できますか?

答えて

1

試してみてください。

df1 <- data.frame(gender = rep(c('M', 'F'), 5), var1 = letters[1:10]) 

new_join <- function(df, sexvar){ 

    df2 <- data.frame(sex = rep(c('M', 'F'), 10), var2 = letters[20:1]) 

    join_vars <- c('sex') 
    names(join_vars) <- sexvar 

    left_join(df, df2, by = join_vars) 
} 

new_join(df1, 'gender') 

私は等の遅延評価を、使用して動作するように、これを取得するよりエレガントな方法があります確信しているが、これはあなたがその間にアップして実行されている取得する必要があります。 (あなたの最後の試みに似ている)

+0

Yesにこれを拡張することも可能であり、それがなかったです、どうもありがとうございました。私は誰かがそのような「よりエレガントな方法」で答えるかどうかを待っています。そうでなければ、私はあなたの答えを受け入れます。もう一度ありがとう –

1

あなたのブロックでonelinerは次のように見ることができ

left_join(df, df2, by = structure("sex", names = sexvar)) 

2 varialbes

left_join(df, df2, by = structure(sexvarDF1, names = sexvarDF2)) 
+0

ありがとう - 私はその機能を知らなかった。アレックスの答えに基づいて、私は既に '' left_join(df、df2、by = setNames(c( 'sex'、 'age')、c(sexvar、agevar)) ' 、それは同様の仕事をするようです –

関連する問題