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.
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? –
sembra un errore di 'dplyr'. –
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