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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 01:15:58