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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.31 03:27:02