Вы можете сначала получить количество наблюдений в месяц с помощью aggregate
, а затем ограничить свой набор данных теми, у которых есть по крайней мере minDays наблюдений, используя merge
.
x <- read.table(sep=c(","), head=T, as.is = TRUE, text=
"date,val1,val2,val3,val4,val5
1996-01-01,5.25,4.20,3.58,6.44,2.66
1996-01-02,10.11,9.22,14.25,12.11,13.22
1996-01-03,25.11,30.44,45.22,31.24,27.35")
minDays <- 10
x$ym <- substr(x$date,1,nchar(x$date)-3) #get year month out of date
tt <- aggregate(val1 ~ ym, data=x, FUN=length) #Get number of observations per month
aggregate(val1 ~ ym, data=merge(x, tt[tt$val1>=minDays, "ym", drop=FALSE]), FUN=mean) #Calculate mean when n observations are >= minDays
Или используя ave
:
x <- read.table(sep=c(","), head=T, as.is = TRUE, text=
"date,val1,val2,val3,val4,val5
1996-01-01,5.25,4.20,3.58,6.44,2.66
1996-01-02,10.11,9.22,14.25,12.11,13.22
1996-01-03,25.11,30.44,45.22,31.24,27.35")
minDays <- 10
x$ym <- substr(x$date,1,nchar(x$date)-3) #get year month out of date
x$n <- with(x, ave(val1, ym, FUN=length))
aggregate(val1 ~ ym, data=x[x$n>=minDays,], FUN=mean)