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

如何用dplyr计算分组内start与finish的时间差并求平均值?

解决方案

1. 生成目标格式的时间差列

原代码未按id分组,存在跨id计算时间差的风险。通过分组+条件判断可以精准实现需求:

library(dplyr)

# 原始数据集
data_frame <- data.frame(id = c(1,1,2,2,3,3),
                         col2 = c("start", "finish", "start", "finish","start", "finish"),
                         col3 =  c(as.POSIXct("2021-05-08 08:32:07"),
                                   as.POSIXct("2021-05-08 08:32:45"),
                                   as.POSIXct("2020-11-28 23:32:09"),
                                   as.POSIXct("2020-11-28 23:32:25"),
                                   as.POSIXct("2021-05-08 08:32:07"),
                                   as.POSIXct("2021-05-08 08:32:12")))

# 处理时间差列
df <- data_frame %>%
  arrange(id, col2) %>%  # 确保每个id内start在前、finish在后
  group_by(id) %>%
  mutate(timetaken = case_when(
    col2 == "start" ~ NA_real_,  # start行设为NA
    col2 == "finish" ~ col3 - first(col3)  # finish行计算与同组start的时间差
  )) %>%
  ungroup()

# 查看结果
df

运行后输出与你期望的格式完全一致:

> df
# A tibble: 6 × 4
     id col2  col3                timetaken
  <dbl> <chr> <dttm>              <drtn>  
1     1 start 2021-05-08 08:32:07 NA secs  
2     1 finish 2021-05-08 08:32:45 38 secs  
3     2 start 2020-11-28 23:32:09 NA secs  
4     2 finish 2020-11-28 23:32:25 16 secs  
5     3 start 2021-05-08 08:32:07 NA secs  
6     3 finish 2021-05-08 08:32:12  5 secs  

2. 计算时间差的平均值

提取所有finish行的时间差,直接计算平均值:

# 计算平均时间差
avg_time <- df %>%
  filter(col2 == "finish") %>%
  pull(timetaken) %>%
  mean()

avg_time

运行结果:

> avg_time
Time difference of 19.66667 secs

内容的提问来源于stack exchange,提问作者JontroPothon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 04:33:20