R语言按分组替换指定时间范围内数据列值的实现问题
错误原因
原代码未将主数据集和存储分组时间边界的df.test按Group关联,直接调用df.test$MinTime/df.test$MaxTime会取出所有组的边界值,分组运算时无法匹配当前组对应的时间范围,最终判断逻辑失效。
推荐解决方案(left_join 关联法,可读性高、适配大数据量)
library(dplyr) df.test.replace <- df %>% # 按分组关联每个组对应的almost peak时间区间 left_join(df.test, by = "Group") %>% # 处于区间内的Status统一替换为peak mutate(Status = if_else(DateTime >= MinTime & DateTime <= MaxTime, "peak", Status)) %>% # 移除临时关联的边界字段,和预期输出格式对齐 select(-MinTime, -MaxTime)
可选方案(分组内直接匹配,无需新增字段)
如果不想做表关联,也可以在分组运算时匹配当前组的边界值:
df.test.replace <- df %>% group_by(Group) %>% mutate(Status = replace(Status, DateTime >= df.test$MinTime[df.test$Group == cur_group()$Group] & DateTime <= df.test$MaxTime[df.test$Group == cur_group()$Group], "peak")) %>% ungroup()
两种方案运行后得到的结果都和你给出的预期输出完全一致。
内容的提问来源于stack exchange,提问作者new2data
相关产品推荐
相关产品推荐

