2011-08-08 69 views
18

我试图写一个函数来3个字母月abreviations转换为数值在R.转换一个月缩写为数字月份,R中

这里就是我的,我在想,如果有一个更好的方式来做到这一点:

numMonth <- function(x) { 
    months <- list(jan=1,feb=2,mar=3,apr=4,may=5,jun=6,jul=7,aug=8,sep=9,oct=10,nov=11,dec=12) 
    x <- tolower(x) 
    sapply(x,function(x) months[[x]]) 
} 

numMonth(c('JAN','DEC')) 

回答

31

由于month.abb是一个系统常数,何不利用:

match("jan", tolower(month.abb)) 
# [1] 1 

mo2Num <- function(x) match(tolower(x), tolower(month.abb)) 
mo2Num(c("jan", "JAN", "Feb", "junk") ) 
#[1] 1 1 2 NA 

如果你想看到的数量相对较少的“系统常数”的休息,去

`?Constants` 

的示例文本意味着这些应该与你的语言环境相关的语言(虽然我我不能用权威说出哪些地方会是。另一种方法可能是在转换为POSIXlt对象后提取月份编号。这种方法需要记住月份编号是基于0的,所以在这个例子中你需要加1。

5

使用矢量化,即:

numMonth<-function(x) 
c(jan=1,feb=2,mar=3,apr=4,may=5,jun=6,jul=7,aug=8,sep=9,oct=10,nov=11,dec=12)[tolower(x)]