2017-02-16 2 views
0

gehen zu versuchen, dies zu vereinfachen, so dass es einfacher zu erklären ist. Angenommen, Sie haben eine Funktion:Übergeben von mehreren Argumenten an eine Funktion aus dem Datenrahmen

testfun = function(jID,kID,d){ 
    g=paste0(jID,kID) 
    date = d 
    bb=data.frame(g,date) 
    return(bb) 
} 

und einen Datenrahmen:

x=data.frame(jID = c("a","b"),kID=c("c","d"),date="20170206",stringsAsFactors = FALSE) 

Ich mag jede Zeile in die Funktionen Eingänge passieren:

so Zyklus 1:

testfun(x[1,1],x[1,2],x[1,3]) -> return(bb) 

Zyklus 2:

testfun(x[2,1],x[2,2],x[2,3]) -> return(bb) 

Ich habe versucht, mit mapply(testfun, x[,1],x[,2],x[,3]), aber ich bin irgendwie eine Zusammenfassung zurück.

Antwort

0

Dies ist eine Lösung mit dplyr. Der Schlüssel besteht darin, nach Zeilen zu gruppieren und die Funktion für jede Zeile auszuführen. Die Ausgabe der Funktion sollte neue Spalten in einem neuen Dataset neben den von Ihnen verwendeten Werten erstellen.

library(dplyr) 

testfun = function(jID,kID,d){ 
    g=paste0(jID,kID) 
    date = d 
    bb=data.frame(g,date) 
    return(bb) 
} 


x=data.frame(jID = c("a","b"),kID=c("c","d"),date="20170206",stringsAsFactors = FALSE) 


x %>% do(data.frame(.,          # keep row of your dataset 
        testfun(.$jID, .$kID, .$date)))  # run the function using the values of that row 

# jID kID  date g date.1 
# 1 a c 20170206 ac 20170206 
# 2 b d 20170206 bd 20170206 

Beachten Sie, dass der Prozess eine neue Spalte date.1 als date schafft existiert für einen Ihrer Eingaben.

0

Ton wie Sie wollen einfach nur eine Vereinfachung

mapply(testfun, x[,1],x[,2],x[,3], SIMPLIFY=FALSE) 

Sie können auszuschalten auch Ihre Funktion

vtestfun <- (Vectorize(testfun, SIMPLIFY=FALSE)) 
vtestfun(x[,1],x[,2],x[,3]) 
vektorisiert
Verwandte Themen