如何在R语言中仅当双向量差值小于±5时计算pm2.5修正值
在R语言中计算PM2.5修正值的实现方案
需求说明
给定如下结构的数据框:
| time_stamp | sensor_index | humidity | temperature | pm2.5_a | pm2.5_b |
|---|---|---|---|---|---|
| 2022-07-15 15:00:00 | 51377 | 37.434 | 102.834 | 18.209 | 17.264 |
| 2022-07-11 22:00:00 | 51377 | 31.267 | 102.367 | 7.982 | 8.971 |
| 2022-07-11 00:00:00 | 51377 | 43.533 | 91.5 | 10.518 | 12.260 |
| 2022-07-11 14:00:00 | 51377 | 51.433 | 95.7 | 14.168 | 20.168 |
需要实现以下逻辑:
- 仅当
pm2.5_a与pm2.5_b的差值绝对值小于5时,计算二者的平均值,再代入公式:0.52*(平均值) - 0.085*humidity + 5.71得到修正值pm_cor - 若差值绝对值≥5,
pm_cor设为空值(NA)
最终期望输出的数据框:
| time_stamp | sensor_index | humidity | temperature | pm2.5_a | pm2.5_b | pm_cor |
|---|---|---|---|---|---|---|
| 2022-07-15 15:00:00 | 51377 | 37.434 | 102.834 | 18.209 | 17.264 | 11.75 |
| 2022-07-11 22:00:00 | 51377 | 31.267 | 102.367 | 7.982 | 8.971 | 7.46 |
| 2022-07-11 00:00:00 | 51377 | 43.533 | 91.5 | 10.518 | 12.260 | 7.93 |
| 2022-07-11 14:00:00 | 51377 | 51.433 | 95.7 | 14.168 | 20.168 |
实现方法
方法1:基础R实现
先构造示例数据框,再用ifelse函数完成条件判断与计算:
# 构造示例数据 df <- data.frame( time_stamp = c("2022-07-15 15:00:00", "2022-07-11 22:00:00", "2022-07-11 00:00:00", "2022-07-11 14:00:00"), sensor_index = rep(51377, 4), humidity = c(37.434, 31.267, 43.533, 51.433), temperature = c(102.834, 102.367, 91.5, 95.7), pm2.5_a = c(18.209, 7.982, 10.518, 14.168), pm2.5_b = c(17.264, 8.971, 12.260, 20.168) ) # 计算pm_cor df$pm_cor <- ifelse( abs(df$pm2.5_a - df$pm2.5_b) < 5, 0.52 * ((df$pm2.5_a + df$pm2.5_b)/2) - 0.085 * df$humidity + 5.71, NA ) # 保留两位小数匹配期望格式 df$pm_cor <- round(df$pm_cor, 2) # 查看结果 print(df)
方法2:dplyr包实现(适合管道式操作)
如果习惯使用tidyverse生态,用mutate+case_when更直观:
library(dplyr) # 构造示例数据 df <- data.frame( time_stamp = c("2022-07-15 15:00:00", "2022-07-11 22:00:00", "2022-07-11 00:00:00", "2022-07-11 14:00:00"), sensor_index = rep(51377, 4), humidity = c(37.434, 31.267, 43.533, 51.433), temperature = c(102.834, 102.367, 91.5, 95.7), pm2.5_a = c(18.209, 7.982, 10.518, 14.168), pm2.5_b = c(17.264, 8.971, 12.260, 20.168) ) # 计算pm_cor df <- df %>% mutate( pm_cor = case_when( abs(pm2.5_a - pm2.5_b) < 5 ~ 0.52 * ((pm2.5_a + pm2.5_b)/2) - 0.085 * humidity + 5.71, TRUE ~ NA_real_ ), pm_cor = round(pm_cor, 2) ) # 查看结果 print(df)
说明
- 两种方法均会生成与期望一致的结果,
round函数用于将结果保留两位小数,匹配示例输出格式 - 条件不满足时,
pm_cor会被设为NA,在数据框中显示为空,符合需求
内容的提问来源于stack exchange,提问作者Kyle
相关产品推荐
相关产品推荐

