2017-05-05 3 views
0

Ich habe hoch und niedrig für die Antwort auf dieses (scheinbar einfache) Problem gesucht, aber kam leer, so hoffe ich, jemand kann mir helfen oder mich zeigen in die richtige Richtung.Wie eine "komplizierte" benutzerdefinierte Funktion auf jedes Element eines tibble anwenden

Ich habe ein ziemlich kompliziertes Submodell, das ich auf ein Dataset anwenden möchte, aber wenn ich nur muate benutze, bekomme ich einen Fehler Variables must be length 1 or 21. Hinzufügen von rowwise() scheint es nicht zu beeinflussen.

Lassen Sie mich folgendes dumme Darstellung des Problems verwenden:

myData <- tibble(x=10:20, y=c("a", "b","a", "b","a", "b","a", "b","a", "b","a")) 

staticData <- tibble(x=0:100, y=c("a"),f=x/100) %>% union (tibble(x=0:100, y=c("b"),f=x/1000)) 

ComplicatedFunction <- function(mystaticData, myx, myy) { 
    #make the base table 
    myBaseTable <- tibble(
    y = myy, 
    x = c(myx:(myx + 20)) 
) 
    #add f rates 
    myBaseTable <- left_join(myBaseTable,mystaticData) 
    #add stuff 
    myBaseTable <- myBaseTable %>% 
    mutate(z = 1 - (f * 0.8)) %>% 
    mutate(zCumulative = cumprod(z)) 
    #Calculate the thing 
    myCalculatedThing <- sum(myBaseTable$zCumulative) 

    return(myCalculatedThing) 
} 

#This is what I want to do 
myData %>% mutate(newcol = ComplicatedFunction(mystaticData = staticData, 
               myx = x, 
               myy = y)) 
#this works 
ComplicatedFunction(mystaticData = staticData, 
        myx = 19, 
        myy = "b") 
ComplicatedFunction(mystaticData = staticData, 
        myx = 20, 
        myy = "a") 

#This works (but would be silly as I want the function to be evaluated for each line) 
myData %>% mutate(newcol = ComplicatedFunction(mystaticData = staticData, 
               myx = 15, 
               myy = "a")) 

#This no longer works, but I dont understand what I am doing wrong 
myData %>% mutate(newcol = ComplicatedFunction(mystaticData = staticData, 
               myx = x, 
               myy = "a")) 

#I tried rowwise(), but this doesnt seem to work either 
myData %>% rowwise() %>% mutate(newcol = ComplicatedFunction(mystaticData = staticData, 
               myx = x, 
               myy = y)) 

Ich hoffe jemand mir erklären kann, was ich hier falsch mache.

Vielen Dank im Voraus!

Sylvain

Antwort

2

Sie können es tun, indem Sie eine neue Funktion partial mit der Erstellung:

library(purrr) 
newCF <- partial(ComplicatedFunction, mystaticData = staticData) 
myData %>% rowwise() %>% mutate(newcol = newCF(myx = x, 
              myy = y)) 
+0

Vielen Dank @Student. Das behebt das Problem. Ich verstehe nicht, warum es notwendig ist, teilweise hinzuzufügen (nachdem ich Hilfe darauf überprüft habe). Wenn es nicht zu viel Mühe macht, können Sie mich auf die Dokumentation verweisen, die erklärt, warum das funktioniert. – Sylvain

+0

'df%>% mutate' funktionierte nicht, da' ComplicatedFunction' keine vektorisierte Funktion ist. Deshalb möchten Sie zum Beispiel 'rowwise' verwenden. Der Grund, warum ich die Verwendung von "partiell" vorgeschlagen habe, liegt darin, dass "staticData" fest ist und nicht zeilenweise behandelt werden sollte. So teilweise erstellt eine neue Funktion, wo StaticData bereits ausgefüllt und jetzt die neue Funktion nur die beiden "dynamischen" Variablen "x" und "y" haben. (Beachten Sie, dass jetzt, wenn ich Ihren Code erneut ausführe, die letzte Codezeile funktioniert, sodass das Problem verschwunden ist und ich mir nicht ganz sicher bin, warum ich das nicht mehr kommentieren kann.) – student

Verwandte Themen