r - 用 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
有任何想法吗?
解决方案
您可以首先使用 获取每月的观察次数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)
推荐阅读
- karate - 无法计算 json 响应的大小
- c# - 使用 JSON 序列化和反序列化类构造函数值
- laravel-5 - 调度命令不在服务器上运行
- nginx - `127.0.0.1' 不是有效域
- reactjs - 如果其他条件在 reactjs 中不起作用
- powershell - Visual Studio 2017 无人值守升级
- mysql - Mysql数据库中(PhpMyAdmin)插入重复外键问题
- php - 如何在 cpanel 上运行工匠命令
- eclipse-plugin - eclipse插件:如何使用actionID调用actionSet
- xpath - 使用 Xpath 在特定节点之后选择特定节点