R语言中如何计算P值大于60对应日期前N天P值的移动求和
R实现P值大于60时往前N天P值求和
注意:示例数据集为日期倒序排列(最新日期在首行),以下实现默认「往前N天」指时间更早的N天,对应数据集内P>60所在行的下方N行数据。如果实际数据集为日期正序排列,调整窗口取数方向即可。
方法1:基础R实现(无需额外安装包)
直接通过循环定位P>60的行,计算对应窗口求和:
# 定义往前取数的天数 N <- 5 # 初始化结果列 df1$sum_prev_N <- NA # 定位所有P>60的行索引 target_rows <- which(df1$Sup60 == 1) for (i in target_rows) { # 校验是否有足够的前序数据,避免下标越界 if (i + N <= nrow(df1)) { df1$sum_prev_N[i] <- sum(df1$P[(i+1):(i+N)]) } }
运行后查看df1,2020-03-25对应的sum_prev_N值为49.6,符合需求。
方法2:滑动窗口函数实现(适合批量处理大数据集)
借助slider包的滑动求和函数,代码更简洁,运行效率更高:
# 首次使用需先安装包 # install.packages(c("dplyr", "slider")) library(dplyr) library(slider) N <- 5 df1 <- df1 %>% mutate( # 计算当前行之后N个值的求和,要求窗口完整 slide_sum = slide_sum(P, .after = N, .complete = TRUE), # 仅保留P>60行的求和结果,其余行设为NA sum_prev_N = ifelse(Sup60 == 1, slide_sum, NA) ) %>% # 移除中间计算列 select(-slide_sum)
如果你更习惯按日期正序处理,可以先把日期列转为日期格式排序后再调整窗口参数:
df1 <- df1 %>% mutate(date = as.Date(date, format = "%m-%d-%Y")) %>% arrange(date) %>% # 按日期从早到晚排序 mutate( slide_sum = slide_sum(P, .before = N, .complete = TRUE), sum_prev_N = ifelse(Sup60 == 1, slide_sum, NA) )
内容的提问来源于stack exchange,提问作者Lenise Martins
相关产品推荐
相关产品推荐

