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

R中按日期与ID聚合:逐小时气温转3小时值并保留站点ID问题求助

问题原因

你混用了dplyr的group_by()语法和base R的aggregate()函数,group_by()的分组设定对base R的函数不会生效,同时你在aggregate()的by参数中仅指定了时间窗口作为分组依据,没有加入ID字段,聚合时默认对所有字段执行均值计算,ID为分类/字符类型自然会返回NA。

解决方案

提供两种常用实现方式,按需选择即可:

方案1:纯base R aggregate 写法

# 先转换日期列为POSIXct格式
df$Date <- as.POSIXct(df$Date)
# 同时指定ID和3小时时间窗口作为分组依据,仅对temp列求均值
Temp_3h <- aggregate(temp ~ ID + cut(Date, "3 hour"), data = df, FUN = mean)
# 调整列名符合预期
colnames(Temp_3h) <- c("ID", "Date", "temp")
# 如果需要Date列为时间格式而非因子,可补充转换
Temp_3h$Date <- as.POSIXct(Temp_3h$Date)

方案2:纯dplyr(tidyverse风格)写法

不需要混合base R函数,语法更统一:

library(dplyr)

Temp_3h <- df %>%
  # 转换日期格式+生成3小时时间窗口
  mutate(Date = as.POSIXct(Date),
         Date = cut(Date, "3 hour")) %>%
  # 同时按ID和时间窗口分组
  group_by(ID, Date) %>%
  # 仅对temp计算均值,na.rm=TRUE可自动跳过缺测值
  summarise(temp = mean(temp, na.rm = TRUE), .groups = "drop") %>%
  # 可选:将Date列从因子转回时间格式
  mutate(Date = as.POSIXct(Date))

如果你需要的是按自然日(24小时)聚合而非3小时窗口,把上述代码中cut(Date, "3 hour")的参数改为cut(Date, "1 day")即可匹配你给出的示例输出。

内容的提问来源于stack exchange,提问作者tabumis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 03:57:02