在R中如何根据日期列计算另一列的年/月均值、最大最小等统计值
R中指定时间范围的水文气象要素统计方法
第一步:预处理日期列
首先要把数据框中字符格式的Date列转换为R可识别的日期格式,推荐使用lubridate包处理,代码如下:
# 未安装包先执行 install.packages(c("tidyverse", "lubridate")) library(tidyverse) library(lubridate) # 原日期格式为月/日/年,用mdy()函数转换 df <- df %>% mutate(Date = mdy(Date))
方法1:手动筛选指定时段计算统计量
直接通过filter()指定时间范围后计算所需指标,注意带空格的列名需要用反引号`包裹:
示例1:计算2013年全年降水的均值、最大值、最小值
df %>% filter(year(Date) == 2013) %>% summarise( 降水均值 = mean(precipitation, na.rm = T), 降水最大值 = max(precipitation, na.rm = T), 降水最小值 = min(precipitation, na.rm = T) )
示例2:计算2013年1月A河径流的均值、最大值、最小值
df %>% filter(year(Date) == 2013, month(Date) == 1) %>% summarise( A河径流均值 = mean(`Stream A Discharge`, na.rm = T), A河径流最大值 = max(`Stream A Discharge`, na.rm = T), A河径流最小值 = min(`Stream A Discharge`, na.rm = T) )
示例3:计算2014年12月的对应指标
只需修改filter()中的年份、月份参数即可:
df %>% filter(year(Date) == 2014, month(Date) == 12) %>% summarise( # 此处填入要计算的指标即可,逻辑和上面一致 )
方法2:按年/月分组批量统计所有时段指标
如果需要一次性输出所有年份、所有月份的统计结果,直接用分组计算即可:
按年分组统计所有年份的指标
year_stat <- df %>% group_by(年份 = year(Date)) %>% summarise( 降水均值 = mean(precipitation, na.rm = T), 降水最大值 = max(precipitation, na.rm = T), 降水最小值 = min(precipitation, na.rm = T), A河径流均值 = mean(`Stream A Discharge`, na.rm = T), A河径流最大值 = max(`Stream A Discharge`, na.rm = T), A河径流最小值 = min(`Stream A Discharge`, na.rm = T) )
按年月分组统计所有月份的指标
month_stat <- df %>% group_by(年份 = year(Date), 月份 = month(Date)) %>% summarise( 降水均值 = mean(precipitation, na.rm = T), 降水最大值 = max(precipitation, na.rm = T), 降水最小值 = min(precipitation, na.rm = T), A河径流均值 = mean(`Stream A Discharge`, na.rm = T), A河径流最大值 = max(`Stream A Discharge`, na.rm = T), A河径流最小值 = min(`Stream A Discharge`, na.rm = T) )
补充:base R实现方法(无需加载第三方包)
# 转换日期格式 df$Date <- as.Date(df$Date, format = "%m/%d/%Y") # 示例:计算2013年全年降水均值 data_2013 <- df[format(df$Date, "%Y") == "2013", ] precip_mean_2013 <- mean(data_2013$precipitation, na.rm = TRUE) # 示例:计算2013年1月A河径流最大值 data_201301 <- df[format(df$Date, "%Y-%m") == "2013-01", ] a_max_201301 <- max(data_201301$`Stream A Discharge`, na.rm = TRUE)
注意事项
- 参数
na.rm = T用于忽略缺失值,避免数据存在空值时返回报错,无缺失值可删除该参数 - 小时尺度数据可通过
hour(Date)函数筛选或按小时分组,逻辑和年、月处理完全一致
内容的提问来源于stack exchange,提问作者Sankar Manalilkada Sasidharan
相关产品推荐
相关产品推荐

