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

R语言多变量(含时间)聚合:按ID和小时计算平均心率

解决方案

推荐:dplyr + lubridate实现

你已经用lubridate解析了时间字段,直接用floor_hour()将时间截断到小时级别,再按用户Id和截断后的小时分组计算平均心率即可,代码如下:

library(dplyr)
library(lubridate)

# 确保Time是lubridate解析后的POSIXct类型(如果还没处理,根据你的时间格式选对应函数,比如ymd_hms/mdy_hms)
sechr$Time <- ymd_hms(sechr$Time)

# 生成小时级时间分组,计算平均心率
hourly_avg_hr <- sechr %>%
  mutate(hourly_time = floor_hour(Time)) %>% # 将时间向下取整到当前小时的起始点
  group_by(Id, hourly_time) %>%
  summarise(avg_heartrate = mean(Heartrate, na.rm = TRUE)) %>% # na.rm=TRUE处理缺失值
  ungroup()

floor_hour()会把任意时间转为对应小时的起始时刻(比如2024-05-20 14:35:20转为2024-05-20 14:00:00),确保同一小时内的记录被归为一组,结合Id分组后就能得到每个用户每小时的平均心率。

用aggregate实现的正确写法

如果偏好使用aggregate,需要把Id和小时级时间同时作为分组变量,修正后的代码:

# 先创建小时级时间列(格式可根据需求调整)
sechr$hourly_time <- format(sechr$Time, "%Y-%m-%d %H:00:00")

# 按Id和hourly_time分组计算平均心率
hourly_avg_hr_agg <- aggregate(Heartrate ~ Id + hourly_time, data = sechr, FUN = mean, na.rm = TRUE)

你之前的代码丢失Id是因为没把它加入分组公式里,现在这样就能保留用户维度。

xts方案(可选)

xts更适合单时间序列分析,多用户场景下不如dplyr直观,不过还是给你参考步骤:

library(xts)

# 按Id拆分数据,分别转为xts对象并按小时聚合
split_data <- split(sechr[, c("Time", "Heartrate")], sechr$Id)
hourly_xts_list <- lapply(split_data, function(df) {
  xts(df$Heartrate, order.by = df$Time) %>%
    period.apply(INDEX = endpoints(., "hours"), FUN = mean, na.rm = TRUE)
})

# 将聚合后的xts列表转回数据框
hourly_avg_hr_xts <- bind_rows(lapply(names(hourly_xts_list), function(id) {
  data.frame(
    Id = id,
    hourly_time = index(hourly_xts_list[[id]]),
    avg_heartrate = coredata(hourly_xts_list[[id]])
  )
}))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:53:12