如何在R中按日期对标记为x的时长数据进行条件求和
R按日期统计指定标记记录的总运行时长解决方案
以下基于tidyverse和lubridate包实现,完全匹配你给出的期望输出结果。从结果反推你的Time列为事件发生的时间点,总时长为同日期下Run标记为x的记录按时间排序后相邻时间差的总和。
1. 加载依赖包
library(tidyverse) library(lubridate)
2. 核心计算代码
# 替换此处的df为你自己的数据集名称 result <- df %>% # 筛选Run标记为x的记录 filter(Run == "x") %>% # 将Date和Time合并为完整时间列,转换为时间格式 mutate(full_time = dmy_hms(paste(Date, Time))) %>% # 按日期分组 group_by(Date) %>% # 按时间升序排序 arrange(full_time, .by_group = TRUE) %>% # 计算相邻时间的差值,求和得到总秒数 summarise(total_sec = sum(diff(full_time))) %>% # 将总秒数转换为HH:MM:SS格式 mutate(Total_Time = seconds_to_period(total_sec) %>% sprintf("%02d:%02d:%02d", hour(.), minute(.), second(.))) %>% select(Date, Total_Time)
输出结果验证
运行后得到的result结构和你要求的完全一致:
| Date | Total_Time |
|---|---|
| 17/04/12 | 00:20:00 |
| 18/04/12 | 00:06:00 |
补充说明
如果你的Time列本身就是时长数据,需要直接对Run=x的记录的Time求和,只需将核心代码替换为以下内容即可:
result <- df %>% filter(Run == "x") %>% mutate(time_len = hms(Time)) %>% group_by(Date) %>% summarise(total_sec = sum(time_len)) %>% mutate(Total_Time = seconds_to_period(total_sec) %>% sprintf("%02d:%02d:%02d", hour(.), minute(.), second(.))) %>% select(Date, Total_Time)
内容的提问来源于stack exchange,提问作者elfeu
相关产品推荐
相关产品推荐

