La fonction suivante fonctionne, mais la dernière partie as.Date a été plus ou moins le résultat d'essais et d'erreurs qui ne comprennent pas complètement.Pourquoi dois-je régler de nouveau l'origine de as.Date après avoir utilisé ifelse? Y a-t-il un meilleur moyen?
### This function creates a real date column out of year/period that is saved in
### in separate columns, plus it handles a 13th period in case of overlapping period
### terminology. Turns quarters into months.
realDate <- function (table,year="year_col",period="period_col"){
if (is.character(table) == TRUE)
{
dframe <- get(table)
}
else{
dframe <- table
}
x <- expression({resDate <- with(dframe,
as.Date(paste(get(year),"-",
ifelse(get(period) > 9, get(period),
paste("0", get(period), sep = "")),
"-01", sep = "")))
})
y <- expression({resDate <- with(dframe,as.Date(paste(get(year) + 1,"-","01","-01",sep="")))})
#### I do not get this? Why do I have to do this?
a <- ifelse(get(period) == 13,eval(y),eval(x))
a <-as.Date(a, origin="1970-01-01")
return(a)
}
Au lieu de cela j'ai essayé de le faire comme ça (parce qu'il était plus intuitive pour moi):
{ ....
ifelse(get(period) == 13,eval(y),eval(x))
return(resDate)
}
Ce sont retournés les valeurs corrigées chaque fois que la condition était faux (pas) mais retourné NA si la la condition était VRAIE (oui). Pourquoi donc? Et si j'utilise la fonction ci-dessus, pourquoi dois-je redéfinir l'origine? Pourquoi j'ai encore appelé as.Date à nouveau?
EDIT:
a <- rep(2002:2010,2)
b <- rep(1:13,2)
d<-cbind(a,b[1:length(a)])
names(d) <- c("year_col","period_col")
P.S .: J'ai trouvé ce thread sur ifelse vectorisé.
donnant une idée sur l'entrée serait bien d'essayer certaines choses. –
Cela fonctionne-t-il correctement si vous faites 'xx <-eval (x); yy <-eval (y); ifelse (get (période) == 13, yy, xx)'? – Marek
désolé pour cela. J'ai édité mon post, vous pouvez cindier toute information à data.frame tant que les deux cols restent. –