使用R语言计算每位受访者访谈日前7天气温超30℃的总天数
用R计算受访者访谈日前7天高温天数的实现方案
需求说明
现有一份调查数据集:
- 首列为
ID,第二列为访谈日期(格式yyyymmdd,范围2021年1月1日至2021年2月28日) - 59个气温列,列名格式为
Xyyyymmdd,对应2021年1月1日至2月28日的每日气温 - 需要计算每位受访者访谈日前7天内气温超过30℃的总天数;若访谈日的前7天涉及无气温数据的时段(2021年1月1日前),则返回
NA
实现步骤与代码
1. 加载依赖包
使用dplyr处理数据,lubridate处理日期格式:
library(dplyr) library(lubridate)
2. 数据准备(示例)
模拟符合结构的数据集(实际使用时替换为你的原始数据):
sample_data <- tibble( ID = 1:4, 访谈日期 = c(20210101, 20210102, 20210201, 20210202), X20210101 = c(25, 24, 24, 26), X20210102 = c(31, 26, 26, 21), X20210103 = c(35, 31, 31, 31) # 补充剩余56个气温列(对应2021年1月4日至2月28日) )
3. 日期格式转换
将访谈日期和气温列的日期统一转为Date类型,方便后续计算:
# 转换访谈日期为Date格式 sample_data <- sample_data %>% mutate(访谈日期 = ymd(访谈日期)) # 提取所有气温列的日期并转为Date格式 temp_dates <- colnames(sample_data)[startsWith(colnames(sample_data), "X")] %>% stringr::str_remove("^X") %>% ymd()
4. 定义计算函数
编写函数实现单条记录的高温天数计算逻辑:
calc_hot_days <- function(interview_date, temp_row_data, temp_dates) { # 确定访谈日前7天的日期范围(不含访谈日当天) start_date <- interview_date - days(7) end_date <- interview_date - days(1) # 若起始日期早于现有气温数据的最早日期,返回NA if (start_date < min(temp_dates)) { return(NA) } # 筛选出对应日期的气温数据 target_temp_values <- temp_row_data[temp_dates >= start_date & temp_dates <= end_date] # 统计气温超过30℃的天数(自动忽略气温缺失值) sum(as.numeric(target_temp_values) > 30, na.rm = TRUE) }
5. 批量计算结果
对每一行数据应用函数,生成最终结果列:
sample_data <- sample_data %>% rowwise() %>% mutate(前7天高温天数 = calc_hot_days(访谈日期, c_across(starts_with("X")), temp_dates)) %>% ungroup()
关键说明
- 对于访谈日期在2021年1月1日至1月7日的记录,前7天涉及2020年的无数据时段,结果返回
NA c_across(starts_with("X"))用于提取当前行的所有气温列数据na.rm = TRUE参数可自动忽略气温数据中的缺失值,若不需要可移除该参数
内容的提问来源于stack exchange,提问作者mgdata
相关产品推荐
相关产品推荐

