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