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
相关产品推荐
相关产品推荐

