2016-07-21 7 views
1

Ich versuche, zwei Tabellen mit dplyr innerhalb einer Funktion, wo einer der Variablennamen durch ein Argument für die Funktion definiert ist. In anderen dplyr-Funktionen ist normalerweise eine Version verfügbar, die für eine nicht standardmßige Auswertung, z. select & select_, rename und rename_ usw., aber nicht für die _join Familie. Ich fand this answer, aber ich kann es nicht unten in meinem Code zu arbeiten:dplyr Join zwei Tabellen innerhalb einer Funktion, wo ein Variablenname ein Argument für die Funktion ist

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') 

der ersten und zweiten Versuch geben dem Fehler

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

während der letzte Versuch, den Fehler gibt

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

was zumindest zeigt, weiß ich will die Spalte gender, aber irgendwie sieht es nicht als Spaltenüberschrift.

Kann jemand darauf hinweisen, wo ich falsch liege?

Antwort

1

Versuchen:

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') 

Ich bin sicher, dass es eine elegantere Möglichkeit, dies zu bekommen faul Auswertung arbeitet mit, etc., aber diese sollten Sie up-and-Laufen in der Zwischenzeit zu bekommen.

+0

Ja, es zu zwei varialbes zu verlängern haben, vielen Dank. Ich werde warten und sehen, ob jemand mit einer so "eleganteren Art" antwortet, sonst werde ich deine Antwort akzeptieren. Danke nochmal –

1

A oneliner in Ihrem Block wie folgt aussehen (was Ihr letzter Versuch ähnlich ist)

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

Es ist auch möglich, diese

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

Danke dafür - ich kannte diese Funktion nicht. Basierend auf Alex 'Antwort habe ich die beiden Variablen bereits in einer einzigen Zeile zusammengefasst: 'left_join (df, df2, by = setNames (c (' sex ',' age '), c (sexvar, agevar))) , die eine ähnliche Aufgabe zu erfüllen scheint –