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

