用r

时间:2019-07-01 11:56:04

标签: r

我有一个R时间序列数据框,其中包含每天约19年数据的多个变量。我只想计算值超过10天的月份的平均值。因此,如果一个月(例如,1996年至2015年整个月的1月)的值少于10天,则我希望将其排除在整个时间段的平均月度计算之外。

数据帧如下:

        date val1,val2,val3,val4,val5
1 1996-01-01 5.25,4.20,3.58,6.44,2.66
2 1996-01-02 10.11,9.22,14.25,12.11,13.22
3 1996-01-03 25.11,30.44,45.22,31.24,27.35
..
..
..
7305 2015-12-31 30.54,55.14,63.12,51.22,45.21

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您首先可以使用aggregate获取每月的观察次数,然后使用merge将数据集限制为至少具有 minDays 观察的数据。

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)