R中基于缺失值阈值的小时转日数据条件聚合问询
解决R语言小时转日级聚合的缺失值阈值问题
我正好做过类似的需求,用dplyr包就能轻松实现!咱们一步步来:
首先,先把你的模拟数据补全成完整的24小时数据(方便测试阈值逻辑),我加了另一天的数据来对比效果:
# 加载dplyr包 library(dplyr) # 构造模拟数据 set.seed(123) # 保证结果可重复 df <- tibble( day = rep(c(as.Date("2005-01-01"), as.Date("2005-01-02")), each = 24), hour = rep(0:23, 2), amount = sample(c(1:20, NA), 48, replace = TRUE), amount2 = sample(c(1:20, NA), 48, replace = TRUE) ) # 手动调整缺失值数量,测试阈值逻辑 df <- df %>% mutate( amount2 = case_when( day == as.Date("2005-01-01") & hour %in% c(1,4,7) ~ NA_real_, # 当天缺失3个,超阈值 day == as.Date("2005-01-02") & hour %in% c(2,5) ~ NA_real_, # 当天缺失2个,达阈值 TRUE ~ amount2 ) )
接下来是核心的聚合逻辑:按日期分组,对每个数值列(amount、amount2),先统计组内缺失值数量,超过2个就返回NA,否则计算平均值:
daily_data <- df %>% group_by(day) %>% summarise( across( c(amount, amount2), # 指定要处理的数值列 ~ ifelse(sum(is.na(.x)) > 2, NA_real_, mean(.x, na.rm = TRUE)) ), .groups = "drop" # 聚合后取消分组,返回普通数据框 ) # 查看最终结果 print(daily_data)
代码细节解释
group_by(day):把同一天的所有小时数据归为一组,方便后续聚合across(...):批量处理多个数值列,避免重复写相同逻辑sum(is.na(.x)):统计当前组内的缺失值总数ifelse(...):核心判断逻辑——缺失值超2个就用NA填充当日均值,否则计算剔除缺失值后的平均值
运行后你会看到:
- 2005-01-01的
amount2因缺失值达3个,结果为NA - 2005-01-02的两个变量缺失值都是2个,正常计算出平均值
如果你习惯用data.table,也可以用这个写法:
library(data.table) setDT(df) daily_data_dt <- df[, lapply(.SD, function(x) { if (sum(is.na(x)) > 2) NA_real_ else mean(x, na.rm = TRUE) }), by = day, .SDcols = c("amount", "amount2")]
这样就完美实现了你要的需求:单日缺失值超2个就用NA填充当日均值,否则正常计算~
内容的提问来源于stack exchange,提问作者Seyed Omid Nabavi
相关产品推荐
相关产品推荐

