如何按时间步分组平均组内值?实现多Metric统一时间戳
R语言:按固定时间区间聚合Metric数据并生成统一时间戳数据框
原始数据框:
df <- data.frame(Metric = c("Stat1", "Stat1", "Stat1", "Stat1", "Stat2", "Stat2", "Stat2", "Stat3", "Stat3", "Stat3", "Stat3"), Timestamp = c("0.000514", "0.060709", "0.091062", "0.134333", "0.000382", "0.060018", "0.133970", "0.007462", "0.078792", "0.115623", "0.148771"), Value = c("10", "20", "25", "30", "11", "21", "31", "12", "22", "32", "37"))
需求说明:
- 为所有Metric统一时间戳(如0.00、0.05、0.10)
- 按固定时间区间([0,0.05)、[0.05,0.10)、[0.10,0.15)...)对每个Metric的
Value取平均值 - 最终生成每个Metric对应所有统一时间戳的聚合后数据
解决方案(使用dplyr包)
# 加载dplyr包 library(dplyr) # 处理数据 df_new <- df %>% # 1. 把字符型的Timestamp和Value转为数值型 mutate( Timestamp = as.numeric(Timestamp), Value = as.numeric(Value) ) %>% # 2. 计算每个时间点所属区间的左端点(即目标统一时间戳) mutate(Interval = floor(Timestamp / 0.05) * 0.05) %>% # 3. 按Metric和区间分组,计算Value的平均值 group_by(Metric, Interval) %>% summarize(Avg_Value = mean(Value), .groups = "drop") %>% # 4. 把Interval格式化为两位小数的字符串,匹配目标格式 mutate( Timestamp = sprintf("%.2f", Interval), Value = as.character(Avg_Value) ) %>% # 5. 选择并排序所需列 select(Metric, Timestamp, Value) %>% arrange(Metric, Timestamp)
验证结果
运行上述代码后,df_new的结构和数值将与目标数据框一致:
# 输出结果 df_new #> Metric Timestamp Value #> 1 Stat1 0.00 10 #> 2 Stat1 0.05 22.5 #> 3 Stat1 0.10 30 #> 4 Stat2 0.00 11 #> 5 Stat2 0.05 21 #> 6 Stat2 0.10 31 #> 7 Stat3 0.00 12 #> 8 Stat3 0.05 22 #> 9 Stat3 0.10 34.5
关键步骤说明
- 类型转换:原始数据的
Timestamp和Value是字符型,必须转为数值型才能进行计算 - 区间计算:通过
floor(Timestamp / 0.05) * 0.05将每个时间点映射到对应区间的左端点,实现统一时间戳的分组 - 聚合计算:分组后用
mean(Value)得到区间内的平均值 - 格式调整:用
sprintf将时间戳格式化为两位小数的字符串,匹配目标数据框的格式
内容的提问来源于stack exchange,提问作者vic
相关产品推荐
相关产品推荐

