使用dplyr mutate按雨量站分组基于前一行结果计算降雨新字段
实现代码
首先加载所需依赖包:
library(tidyverse)
写法1:基础循环逻辑(可读性高,适合调试)
rain_result <- raw_rain_data %>% # 按雨量站、日期升序排序,保证每个站的计算顺序正确 arrange(Gauge, Sample.Date) %>% # 按雨量站分组,各组独立计算互不干扰 group_by(Gauge) %>% mutate( Rain_Calc = { rf_vec <- Rainfall calc_vec <- numeric(length(rf_vec)) # 分组首行即2016-01-02,初始化值为1.0 calc_vec[1] <- 1.0 # 迭代计算后续所有日期的Rain_Calc for (i in 2:length(rf_vec)) { calc_vec[i] = 0.7 * (rf_vec[i] + calc_vec[i-1]) } calc_vec } ) %>% ungroup()
写法2:purrr函数式写法(代码更简洁)
rain_result <- raw_rain_data %>% arrange(Gauge, Sample.Date) %>% group_by(Gauge) %>% mutate( Rain_Calc = c(1, accumulate(tail(Rainfall, -1), ~0.7*(.y + .x))) ) %>% ungroup()
注意事项
- 以上代码默认每个Gauge分组的第一行对应日期为2016-01-02,如果原始数据存在日期缺失、分组内首行不是起始日的情况,需要先做数据过滤/补全,确保分组内的行顺序和日期升序完全匹配
- 两种写法对27万行的数据集运算效率没有明显差异,可根据个人使用习惯选择
内容的提问来源于stack exchange,提问作者tm95
相关产品推荐
相关产品推荐

