如何修复此错误"条件的长度为> 1,只使用第一个元素"?

时间:2014-03-19 19:53:52

标签: r

我正在编写一个函数来查找当前日期的x个月的日期。我一直收到错误/警告。

DateBack <- function(CurrentYear, CurrentMonth, MonthsBack){
if(MonthsBack< 13){
    if(MonthsBack>=CurrentMonth){
        month<-12+CurrentMonth-MonthsBack
        datet<-paste(CurrentYear-1,month, sep="-")
    } 
    else{
        month<-CurrentMonth-MonthsBack
        datet<-paste(CurrentYear-1, month, sep="-")
    }
} 
else{
    Years <- trunc(MonthsBack/12,0)
    if((MonthsBack-12*Years)>=CurrentMonth){
        month<-12+CurrentMonth-MonthsBack
    } 
    else{
        month<-CurrentMonth-MonthsBack
    }
    datet<-paste(CurrentYear-Years, month, sep="-")
}
return(datet)
}

CurrentYear<- c(2000, 2000, 2003, 2004)
CurrentMonth<-c(1, 2, 6, 12) 

df<- data.frame(CurrentYear, CurrentMonth)

df$MonthsBack <- DateBack(df$CurrentYear,df$CurrentMonth,1)

警告讯息: 在if(MonthsBack&gt; = CurrentMonth){:   条件的长度> 1,只使用第一个元素

我该如何纠正此错误?

1 个答案:

答案 0 :(得分:0)

我也是第二个CarlWitthoft评论,尽管通过日期函数似乎没有一个简单的答案。

代码中的问题是没有向量化的条件语句。您可以以完全向量化的方式实现它而不使用IF语句:

DateBack = function (Y,M, monthsBack) {
   YM = (Y*12 + M - 1) - monthsBack
   newY = YM %/% 12
   newM = YM %% 12 + 1
   return( paste( newY, newM, sep="-"))
 }

DateBack( c(2000,2000,2003,2004),c(1,2,6,12),1)
[1] "1999-12" "2000-1"  "2003-5"  "2004-11"