2017-02-23 26 views
2

как я могу предотвратить, чтобы mapply менял даты на парные?mapply изменяет даты, чтобы удвоить

Это то, что я имею в виду:

datedf<-data.frame(y=as.character(rep(2010,12)),m=as.character(seq(1,12,1)),stringsAsFactors=FALSE) 
head(datedf) 

yyyymm_to_date<-function(y,m) { 
    return(as.Date(paste0(y,ifelse(nchar(m)==1,paste0("0",m),m),"01"),"%Y%m%d")) 
}  

yyyymm_to_date("2000","4") # prints "2010-04-01" 

datedf$d<-mapply(FUN=yyyymm_to_date,y=datedf$y,m=datedf$m,SIMPLIFY=FALSE) # simplify does not help 
head(datedf) # prints double numbers ?? --> want dates 

Thx & вид касается

ответ

2

Вам просто нужно do.callmapply возвращает list), ваш код прекрасно:

datedf$d <- do.call('c',mapply(FUN=yyyymm_to_date,y=datedf$y,m=datedf$m,SIMPLIFY=FALSE)) 
head(datedf) 
#  y m   d 
#1 2010 1 2010-01-01 
#2 2010 2 2010-02-01 
#3 2010 3 2010-03-01 
#4 2010 4 2010-04-01 
#5 2010 5 2010-05-01 
#6 2010 6 2010-06-01 
2

один вкладыш, а не все эти вызовы функций.

as.Date(with(datedf, paste(y, sprintf("%02d", as.numeric(m)), "01", sep = "-"))) 

# "2010-01-01" "2010-02-01" "2010-03-01" "2010-04-01" "2010-05-01" 
# "2010-06-01" "2010-07-01" "2010-08-01" "2010-09-01" "2010-10-01" 
# "2010-11-01" "2010-12-01" 

Проверка классу

a <- as.Date(with(datedf, paste(y,sprintf("%02d", as.numeric(m)),"01",sep = "-")))) 
class(a) 
#[1] "Date" 

We paste01 для каждой комбинации года (y) и месяц (m), а затем преобразовать его в актуальном состоянии as.Date.

Смежные вопросы