如何在R中计算硝酸盐浓度日的前置3/5日降水累积和
R实现:NO3有效值对应前置时段降水累积和
需求说明
仅在NO3列存在有效值时,计算该日期之前3日、5日的PPT降水累积和(不含当天降水),最终输出仅保留有NO3值的行及对应累积结果。
步骤1:准备数据
将你提供的子集数据转为R可处理格式:
df <- data.frame( Date = c("7/1/1991", "7/2/1991", "7/3/1991", "7/4/1991", "7/5/1991", "7/6/1991", "7/7/1991", "7/8/1991", "7/9/1991", "7/10/1991", "7/11/1991", "7/12/1991", "7/13/1991", "7/14/1991", "7/15/1991", "7/16/1991", "7/17/1991", "7/18/1991", "7/19/1991", "7/20/1991", "7/21/1991", "7/22/1991", "7/23/1991", "7/24/1991", "7/25/1991", "7/26/1991", "7/27/1991", "7/28/1991", "7/29/1991", "7/30/1991", "7/31/1991", "8/1/1991", "8/2/1991", "8/3/1991", "8/4/1991", "8/5/1991", "8/6/1991", "8/7/1991", "8/8/1991", "8/9/1991", "8/10/1991", "8/11/1991", "8/12/1991", "8/13/1991", "8/14/1991", "8/15/1991"), PPT = c(0,0,0,0,0,0,0,0,0,0,0,1.4,6,0.6,9,0,2.2,0,0,3.4,3,0,0,3,0,0,0.2,0,0.4,0,0,0,0,0,0,0,0,1.4,4.6,27.4,23.8,4,5,0,0,0), NO3 = c(NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,3.2,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,3.09) )
步骤2:方法1(高效推荐:用slider包)
适合大数据集,滑动窗口计算效率更高:
# 加载依赖包 library(dplyr) library(lubridate) library(slider) # 转换日期为标准格式 df <- df %>% mutate(Date = mdy(Date)) # 计算前置3日、5日累积降水(不含当天) df_processed <- df %>% mutate( # 前置3日:前1~3天的PPT总和 PPT_3day = slide_dbl(PPT, ~sum(.), .before = 3, .after = -1, .complete = TRUE), # 前置5日:前1~5天的PPT总和 PPT_5day = slide_dbl(PPT, ~sum(.), .before = 5, .after = -1, .complete = TRUE) ) # 提取仅NO3有值的结果 final_result <- df_processed %>% filter(!is.na(NO3)) %>% select(Date, NO3, PPT_3day, PPT_5day) # 查看结果 print(final_result)
步骤3:方法2(无额外依赖:用dplyr逐行计算)
无需安装slider包,适合小数据集:
library(dplyr) library(lubridate) # 转换日期格式 df <- df %>% mutate(Date = mdy(Date)) # 逐行计算累积和 df_processed <- df %>% mutate(row_id = row_number()) %>% rowwise() %>% mutate( # 仅NO3非NA时计算,避免无效行消耗资源 PPT_3day = ifelse(!is.na(NO3), sum(PPT[max(1, row_id-3):(row_id-1)]), NA), PPT_5day = ifelse(!is.na(NO3), sum(PPT[max(1, row_id-5):(row_id-1)]), NA) ) %>% ungroup() %>% select(-row_id) # 提取结果 final_result <- df_processed %>% filter(!is.na(NO3)) %>% select(Date, NO3, PPT_3day, PPT_5day) print(final_result)
结果验证
运行后得到符合需求的结果:
| Date | NO3 | PPT_3day | PPT_5day |
|---|---|---|---|
| 1991-07-15 | 3.20 | 8.0 | 8.0 |
| 1991-08-15 | 3.09 | 5.0 | 32.8 |
内容的提问来源于stack exchange,提问作者arcticmermaid
相关产品推荐
相关产品推荐

