You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

结果验证

运行后得到符合需求的结果:

DateNO3PPT_3dayPPT_5day
1991-07-153.208.08.0
1991-08-153.095.032.8

内容的提问来源于stack exchange,提问作者arcticmermaid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 14:09:26