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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:55:07