0
我已經搜索了這個(看似簡單)問題的答案的高和低,但空出來,所以我希望有人可以幫助我或指出我在正確的方向。如何在一個tibble的每個元素上應用一個「複雜的」用戶定義函數
我有一個相當複雜的子模型,我想應用於數據集,但如果我只是使用使用mutate,我得到一個錯誤Variables must be length 1 or 21.
添加rowwise()似乎並沒有影響它。
讓我使用的問題如下圖傻:
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))
我希望有人能向我解釋什麼,我做錯了。
非常感謝提前!
西爾
非常感謝@Student。解決這個問題。我不明白爲什麼有必要添加部分雖然(檢查後幫助)。如果沒有太多的麻煩,你能指出我解釋爲什麼這會起作用的文件。 – Sylvain
'df%>%mutate'不起作用,因爲'ComplicatedFunction'不是矢量化函數。這就是爲什麼你想使用'rowwise'的例子。我提出使用'partial'的原因是因爲'staticData'是固定的,不應該按行處理。所以部分地創建了一個新的函數,其中staticData已經填充,現在新函數只有兩個「動態」變量'x'和'y'。 (請注意,現在當我重新運行你的代碼時,最後一行代碼有效,所以問題已經消失,我不確定爲什麼,所以我不能更多地評論它。) – student