2017-05-05 50 views
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)) 

我希望有人能向我解釋什麼,我做錯了。

非常感謝提前!

西爾

回答

2

您可以通過創建使用partial新功能做到這一點:

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

非常感謝@Student。解決這個問題。我不明白爲什麼有必要添加部分雖然(檢查後幫助)。如果沒有太多的麻煩,你能指出我解釋爲什麼這會起作用的文件。 – Sylvain

+0

'df%>%mutate'不起作用,因爲'ComplicatedFunction'不是矢量化函數。這就是爲什麼你想使用'rowwise'的例子。我提出使用'partial'的原因是因爲'staticData'是固定的,不應該按行處理。所以部分地創建了一個新的函數,其中staticData已經填充,現在新函數只有兩個「動態」變量'x'和'y'。 (請注意,現在當我重新運行你的代碼時,最後一行代碼有效,所以問題已經消失,我不確定爲什麼,所以我不能更多地評論它。) – student

相關問題