如何用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
相关产品推荐
相关产品推荐

