使用mutate计算前一周温度平均值的技术问询
解决方案
这里提供两种高效的方法来计算每条记录日期前一周的温度平均值,解决你之前用case_when和group_by无法实现滚动窗口的问题:
方法一:dplyr + slider(推荐,贴合tidyverse语法)
slider包专门处理基于时间/索引的滚动窗口计算,能精准匹配日期范围,不受日期不连续的影响(比如某天数据缺失的情况)。
- 加载所需工具包:
library(dplyr) library(slider) library(lubridate)
- 确保日期格式正确并排序:
# 若dt还不是Date类型,先转换格式 weather_data <- weather_data %>% mutate(dt = as_date(dt)) %>% arrange(dt) # 必须按日期排序,否则窗口计算会出错
- 创建
prev.temp列:
weather_data <- weather_data %>% mutate(prev.temp = slide_index_dbl( .x = temp, # 要计算均值的数值列 .i = dt, # 用于定义窗口的日期列 .y = dt, # 当前记录的日期 .f = function(x, dates, current_dt) { # 筛选当前日期前7天(不含当天)的温度数据,计算均值 target_dates <- dates >= current_dt - days(7) & dates < current_dt mean(x[target_dates], na.rm = TRUE) } ))
方法二:data.table(适合大数据量,计算高效)
如果后续数据量增大,data.table的非等值连接能快速完成需求:
- 转换数据格式并排序:
library(data.table) setDT(weather_data) weather_data[, dt := as.Date(dt)] setorder(weather_data, dt) # 按日期排序
- 计算前一周温度均值:
weather_data[, prev.temp := sapply(dt, function(current_dt) { # 匹配当前日期前7天到前一天的所有记录,计算温度均值 mean(weather_data[dt >= current_dt - 7 & dt < current_dt, temp], na.rm = TRUE) })]
关键注意事项
- 排序是前提:无论用哪种方法,必须确保数据按
dt升序排列,否则窗口范围会匹配错误。 - 缺失值处理:
na.rm = TRUE用于忽略温度列的缺失值,若数据无缺失可移除该参数。 - 窗口范围可调整:如果需要修改前一周的定义(比如包含当前日期),只需调整
dates < current_dt这类条件即可。
内容的提问来源于stack exchange,提问作者Bethy
相关产品推荐
相关产品推荐

