我有一个函数,它将两个日期作为输入,并返回它们之间的季节数。
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)
答案 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])
我不确定这个或类似的是你的实际数据是否也有问题???