2017-05-10 3 views
0

Ich muss zwei data.frames mithilfe einer benutzerdefinierten Funktion binden. Als Beispiel stellen wir uns vor, dass die Datenrahmen so aussehen.Unquoting Variable in benutzerdefinierten Funktion

library(dplyr) 
library(lazyeval) 

df<-data.frame(type1=c("a","b","c","a","b","c",NA),type2=c("d","e","f","d","e","f","f")) 

     f<-function(x){ 
     y<-df%>% 
     dplyr::filter_(lazyeval::interp(~!is.na(x),x=as.name(x)))%>% 
     dplyr::group_by_(x)%>% 
     dplyr::summarize("Sum"=sum(type2=="d")) 
     y<-dplyr::bind_rows(y,data.frame(x="Total",Sum=sum(y$Sum))) 
    return(y) 
    } 

    result_f<-f("type1") 

Das Problem ist, dass diese Funktion wird davon ausgegangen, dass der Name der Variablen „Total“ in dem zweiten Datenrahmen ist „x“ anstelle von „Total“ eine zusätzlichen Spalte aufgrund der Nichtübereinstimmung mit dem ersten Datenrahmen zu schaffen.

Wie kann die Funktion x als Variable statt als String interpretieren? Unquoting? Wie?

+2

Es wäre schön, wenn Sie Ihr Beispiel [reproduziert] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) von einschließlich Beispieleingangsdaten und der gewünschten Ausgabe, so dass mögliche Lösungen getestet und verifiziert werden können. – MrFlick

+0

Entschuldigung, ich habe das Skript falsch eingefügt. Ich füge es nur zur Frage hinzu. – ungatoverde

Antwort

1

Sie können die letzte Zeile in der Funktion

y <- dplyr::bind_rows(y,setNames(data.frame("Total",sum(y$Sum)), c(x, "Sum"))) 

zu

ändern, dass die Namen des data.frame gesetzt werden Sie zu den ursprünglichen Namen zu binden, in versuchen.

Bevor Sie zu viel Zeit damit verbringen, alle Unterstreichungsfunktionen in dplyr zu lernen, beachten Sie, dass sie in der nächsten Version (0.6) durch eine völlig andere Methode der nicht standardmäßigen Auswertung abgelöst werden. Lesen Sie hier mehr: https://blog.rstudio.org/2017/04/13/dplyr-0-6-0-coming-soon/

Verwandte Themen