2015-04-23 13 views
5

Sto provando a utilizzare una funzione condizionale lead/lag in un pipe dplyr utilizzando ifelse ma ottenendo un errore. Tuttavia, utilizzando lo stesso approccio al di fuori del tubo sembra funzionare. Cosa mi manca?R: lead/lag condizionale dplyr pipe utilizzando ifelse con comportamento imprevisto

require(dplyr) 

dati:

test <- data.frame(a = c("b","b","b","b","b","b", 
         "m","m","m","m","m","m", 
         "s","s","s","s","s","s"), 
        b = replicate(1,n=18), 
        stringsAsFactors=F) 

tubo dplyr:

test %>% 
    mutate(delta = ifelse(a == "s", b + lag(b, n = 2*6), 
         ifelse(a == "m", b + lag(b, n = 1*6), 0))) 

# Error: could not convert second argument to an integer. type=LANGSXP, length = 3 

senza il tubo funziona:

test$delta <- ifelse(test$a == "s", test$b + lag(test$b, n = 2*6), 
        ifelse(test$a == "m", test$b + lag(test$b, n = 1*6), 0)) 

ho trovato qualche indicazione che c'era un problema con dplyr lead/lag in combinazione con i frame di dati raggruppati. Ma non sto raggruppando qui.

Informazioni sulla versione: R 3.1.1 e dplyr_0.4.1.

risposta

1

dplyr non riesce a analizzare l'espressione. Una soluzione è quella di definire la funzione prima:

foo <- function(a, b) 
    ifelse(a=="s",b+lag(b,n=2*6), ifelse(a=="m",b+lag(b,n=1*6),0)) 
test %>% mutate(delta = foo(a,b)) 
4

questo:

test %>% 
    mutate(delta = ifelse(a=="s",b+lag(b,n=12), 
          ifelse(a=="m",b+lag(b,n=6),0))) 

opere. Ciò significa che non è possibile passare le espressioni negli argomenti lag.

+2

Se è così, perché 'IfElse (test $ a == "s", prova $ b + lag (test $ b, n = 2 * 6), IfElse (test $ a == "m", test $ b + lag (test $ b, n = 1 * 6), 0)) 'funziona? –

+2

sembra un errore di 'dplyr'. –

+0

Questo è correlato alla valutazione delle espressioni. In questo codice tutte le espressioni sono valutate nell'ambiente globale, nel caso di dplyr, la valutazione avviene in un ambiente diverso. Questo è probabilmente un bug in dplyr. – mpiktas