如何按分钟计算R语言DataFrame中Speed列的平均值?
问题描述
现有如下结构的DataFrame(final_date_time列类型为POSIXct):
Id final_date_time Speed 2022484408 2016-04-12 07:21:00 97 2022484405 2016-04-12 07:21:05 102 2022484402 2016-04-12 07:21:10 105 2022484407 2016-04-12 07:21:20 103 2022484408 2016-04-12 07:21:25 101 2022484408 2016-04-12 07:22:05 95 2022484410 2016-04-12 07:22:10 91 2022484408 2016-04-12 07:22:15 93 2022484421 2016-04-12 07:22:20 94 2022484408 2016-04-12 07:22:25 93 2022484421 2016-04-12 07:22:35 92 2022484421 2016-04-12 07:22:40 89 2022484447 2016-04-12 07:22:50 83 2022484488 2016-04-12 07:22:55 61 2022484411 2016-04-12 07:23:00 60
对应的dput信息:
structure(list(Id = c(2022484408, 2022484408, 2022484408, 2022484408, 2022484408, 2022484408), new_final_date = structure(c(1460438460, 1460438465, 1460438470, 1460438480, 1460438485, 1460438525), class = c("POSIXct", "POSIXt"), tzone = ""), Value = c(97L, 102L, 105L, 103L, 101L, 95L)), row.names = c(NA, 6L), class = "data.frame")
你尝试的xts方法因列名错误和转换方式问题无法运行,修正后的方案及其他常用方法如下:
方法1:dplyr + lubridate(语法直观,适合常规场景)
通过floor_date将时间截断到分钟级别,再分组计算平均值:
library(dplyr) library(lubridate) # 假设你的DataFrame名为df result_df <- df %>% # 将final_date_time截断到当前分钟的起始时刻 mutate(minute_time = floor_date(final_date_time, unit = "minute")) %>% # 按分钟分组,计算Speed的平均值 group_by(minute_time) %>% summarise(avg_speed = mean(Speed, na.rm = TRUE))
方法2:data.table(高效处理大数据量)
利用trunc截断时间,结合data.table的分组语法快速计算:
library(data.table) # 将DataFrame转换为data.table格式 setDT(df) # 按截断后的分钟时间分组,计算平均速度 result_dt <- df[, .(avg_speed = mean(Speed, na.rm = TRUE)), by = .(minute_time = as.POSIXct(trunc(final_date_time, "min")))]
方法3:修正后的xts方法
针对你之前的代码,修正列名和xts对象的创建方式:
library(xts) # 以final_date_time为索引,创建包含Speed列的xts对象 x <- xts(df$Speed, order.by = df$final_date_time) # 按1分钟间隔计算平均值 period_avg <- period.apply(x, endpoints(x, "minutes", 1), mean) # 转换为DataFrame格式便于查看 result_xts <- as.data.frame(period_avg) %>% rename(avg_speed = V1) %>% mutate(minute_time = index(period_avg))
内容的提问来源于stack exchange,提问作者RoverWild
相关产品推荐
相关产品推荐

