R语言按连续trip时间簇条件计算speedms均值并填充
R实现连续trip簇speed均值计算
核心思路
- 标记所有观测的trip类型属性
- 为连续的同类型观测(连续trip/连续非trip)分配唯一分组ID
- 仅对分组ID对应的trip簇计算speedms列的均值,非trip簇对应的MEAN值设为空值
示例数据准备
先构建匹配需求的原始数据集,与题目给出的结构完全一致:
df <- data.frame( Time = c("1:12:21", "1:12:22", "1:12:23", "1:12:24", "1:12:25", "1:12:26", "1:12:27", "1:12:28", "1:12:29", "1:12:30", "1:12:31", "1:12:32", "1:12:33"), speedms = c(1.0978790, 1.5707432, 1.0745824, 1.1682027, 1.3859502, 0.9657960, 1.2591893, 2.0004471, 2.2239989, 1.6928664, 2.8167094, 3.7848781, 0.4496923), type = c("trip", "trip", NA, NA, NA, "trip", "trip", "trip", NA, NA, "trip", "trip", NA) )
实现方法
方法1:dplyr 实现(代码简洁易读,推荐)
依赖dplyr包的向量化操作,运行效率高:
library(dplyr) result <- df %>% # 标记当前行是否为trip类型 mutate(is_trip = type == "trip") %>% # 为连续相同类型的观测生成连续分组ID mutate(grp = cumsum(is_trip != lag(is_trip, default = first(is_trip)))) %>% # 分组计算均值,非trip组的MEAN设为NA group_by(grp) %>% mutate(MEAN = ifelse(first(is_trip), mean(speedms), NA)) %>% # 清理辅助列 ungroup() %>% select(-is_trip, -grp)
计算得到的MEAN值与题目给出的期望输出完全匹配:
- 第一个trip簇(行1-2)均值为1.334311
- 第二个trip簇(行6-8)均值为1.408477
- 第三个trip簇(行11-12)均值为3.300793
方法2:基础R 实现(无需加载额外包)
纯基础函数实现,适合无额外包安装权限的场景:
# 生成trip类型标记 is_trip <- df$type == "trip" # 计算连续同类型的分组ID grp <- cumsum(c(TRUE, diff(is_trip) != 0)) # 初始化MEAN列为空值 df$MEAN <- NA # 逐簇计算trip组的speed均值 for (g in unique(grp)) { row_index <- which(grp == g) # 仅处理trip类型的簇 if (is_trip[row_index[1]]) { df$MEAN[row_index] <- mean(df$speedms[row_index]) } }
内容的提问来源于stack exchange,提问作者pampi
相关产品推荐
相关产品推荐

