长度为0的参数

时间:2013-11-25 14:56:39

标签: r

我有一个函数,它将两个日期作为输入,并返回它们之间的季节数。

nSeason<-function(date1,date2){
  n=0
  date1<-as.Date(date1, "%Y-%m-%d")
  date2<-as.Date(date2,"%Y-%m-%d")
  d<-date1:date2
  for(i in d){
    if(!(getSeason(as.Date(i,origin="1970-01-01")) == getSeason(as.Date(i,origin="1970-    01-01")+1))){
      n=n+1
    }
  }
  return(n)
}

getSeason <- function(DATES) {
  repr <- as.Date("2012-03-21", format = "%Y-%m-%d") 
  pos_repr <- as.Date("2012-7-1",  format = "%Y-%m-%d") 
  inverno<- as.Date("2012-10-21",  format = "%Y-%m-%d") 

  # Convert dates from any year to 2012 dates
  d <- as.Date(strftime(DATES, format="2012-%m-%d"))

  ifelse (d >= repr & d < pos_repr, "repr",
          ifelse (d >= pos_repr & d < inverno, "pos_repr","inverno"))
}

这个函数运行正常,但是当我尝试将它应用于带有两列(capture_date,end_date)的data.frame时,我收到一个错误:

for(i in 1:length(dados$ano_captura)){
  dados$freq[i]<-nSeason(dados$capture_date[i], dados$end_date[i])
  dados$freq[i]<-dados$freq[i]+1
  if(dados$status[i]==0){
    dados$freq[i]=1
  }
}


Error in date1:date2 : argument of length 0

似乎有什么问题?我找不到它..

编辑(来自OP评论的数据):

str(dados) 'data.frame':    154 obs. of 42 variables: 
$ id : int 1 2 3 4 5 6 7 8 9 10 ... 
$ Ref_ind : Factor w/ 118 levels "","150,035","150,045",..: 5 7 11 14 21 22 28 8 16 10 ... 
$ capture_date : Date, format: "2009-04-06" "2009-04-06" ... 
$ status : int 1 1 1 1 1 1 1 1 1 1 ... 
$ X : int NA NA NA NA NA NA NA NA NA NA ... 
$ end_date : Date, format: "2009-11-03" "2010-11-28" ... 

这是d的第一行:
      [1] 14340 14341 14342 14343 14344 14345 14346

这是可重现的例子:

dados<-matrix(c("2009-04-06" ,"2009-04-06" ,"2009-04-07","2009-04-07",
            "2009-04-07", "2009-04-08","2009-11-03", "2010-11-28", "2009-08-30",
        "2009-11-22", "2010-01-28", "2009-05-07"),ncol=2,nrow=6)
colnames(dados)<-c("capture_date","end_date")
dados<-data.frame(dados)
dados$capture_date<-as.Date(dados$capture_date,"%Y-%m-%d")
dados$end_date<-as.Date(dados$end_date,"%Y-%m-%d")
dados$status<-c(1,1,1,1,1,1)

2 个答案:

答案 0 :(得分:1)

好的,我通过替换长度(dados $ ano_captura)解决了这个问题。它被误写了......

for(i in 1:lenght(dados$status){
  dados$freq[i]<-nSeason(dados$capture_date[i], dados$end_date[i])
  dados$freq[i]<-dados$freq[i]+1
  if(dados$status[i]==0){
    dados$freq[i]=1
  }
}

谢谢大家

答案 1 :(得分:0)

好的,可重复的例子可能需要一些工作吗?

    dados<-matrix(c("2009-04-06" ,"2009-04-06" ,"2009-04-07","2009-04-07",
                    "2009-04-07", "2009-04-08","2009-11-03", "2010-11-28", "2009-08-30",
                "2009-11-22", "2010-01-28", "2009-05-07"),ncol=2,nrow=6)
    colnames(dados)<-c("capture_date","end_date")
    # at this point dados is a matrix not a data.frame

    # now it's a vector of dates    
    dados<-as.Date(dados,"%Y-%m-%d")

无论哪种方式都不能像

一样调用
nSeason(dados$capture_date[i], dados$end_date[i])

我不确定这个或类似的是你的实际数据是否也有问题???