2017-05-05 8 views
0

나는 (겉으로보기에는 단순한)이 문제에 대한 답을 찾기 위해 높고 낮음을 찾았지만 아무 것도 나에게 도움을 주거나 나를 가리켜 주길 빈다. 올바른 방향으로tibble의 각 요소에 "복잡한"사용자 정의 함수를 적용하는 방법

데이터 세트에 적용하려는 상당히 복잡한 서브 모델을 사용하지만, 단지 mutate를 사용하면 Variables must be length 1 or 21. 오류가 발생하여 영향을 미치지 않습니다.

나에게 다음과 같은 문제의 어리석은 그림을 사용하자 :

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'는'CompleicatedFunction'이 벡터화 된 함수가 아니기 때문에 작동하지 않았습니다. 이것은 왜 당신이'rowwise'를 사용하길 원하는지에 대한 것입니다. 'partial'을 사용하여 제안한 이유는'staticData'가 고정되어 있고 행별로 처리해서는 안되기 때문입니다. 그래서 partial은 staticData가 이미 채워져 있고 새로운 함수는 두 개의 "동적 인"변수'x'와'y' 만 가지고있는 새로운 함수를 만들었습니다. (이제 코드를 다시 실행하면 코드의 마지막 줄이 작동하므로 문제가 사라졌고 그 이유에 대해서는 잘 모르겠습니다.) – student