如何在R中按ID和Measurement分组计算步骤间耗时?
解决方案:按ID和MEASUREMENT分组计算步骤间耗时
我来帮你搞定这个问题!先明确核心需求:
按
ID和MEASUREMENT分组,Step1耗时固定为0;Step2及以上的耗时 = 当前Step的StartDatetime- 上一步的EndDatetime
你的现有代码问题分析
你用plyr::ddply时踩了两个关键坑:
- 分组维度错误地包含了
Step,导致每个Step单独成组,完全无法获取上一步的EndDatetime - 直接调用整个数据集的
df1$StartDatetime和df1$EndDatetime,没有针对分组内的数据计算,结果自然不对
推荐解决方案(用dplyr,现代高效)
现在主流用dplyr处理这类分组计算,代码清晰易读:
library(dplyr) # 处理数据 df_result <- df1 %>% # 按需求的核心维度分组:ID和MEASUREMENT group_by(ID, MEASUREMENT) %>% # 确保每组内按Step顺序排列(避免Step乱序导致计算错误) arrange(Step, .by_group = TRUE) %>% # 计算耗时:Step1固定为0,其他用当前Start减上一步的End mutate( ElapsedTime = case_when( Step == "1" ~ 0, TRUE ~ as.numeric(difftime(StartDatetime, lag(EndDatetime), units = "secs")) ) ) %>% # 取消分组(可选,根据后续操作需求) ungroup() # 查看匹配期望的结果 print(df_result)
如果你坚持用plyr的修正版
如果你习惯用plyr,可以这样调整,核心是只按ID和MEASUREMENT分组,在分组内处理逻辑:
library(plyr) df_result_plyr <- ddply(df1, .(ID, MEASUREMENT), function(group_data) { # 先按Step排序分组内的数据 group_data <- arrange(group_data, Step) # 计算耗时:第一个值为0,后面的用第2-n行的Start减第1-(n-1)行的End group_data$ElapsedTime <- c(0, as.numeric(difftime( group_data$StartDatetime[-1], group_data$EndDatetime[-nrow(group_data)], units = "secs" ))) return(group_data) })
结果验证
运行上述代码后,得到的ElapsedTime会和你期望的输出完全一致:
- 比如
A Length Step2的耗时是60秒(2015-09-29 00:02:13-2015-09-29 00:01:13) A Width Step3的耗时是0秒(当前Step的Start和上一步的End为同一时间)
内容的提问来源于stack exchange,提问作者Sharath
相关产品推荐
相关产品推荐

