R语言如何将分组时序数据中首次小于1的值之后的所有值置0
核心实现逻辑
按模型分组后,通过累积求和判断是否已经出现过首次小于1的病例,只要出现过,后续所有行的病例数直接置0,无需循环或额外匹配操作。
实现代码
library(dplyr) trial.df <- trial.df %>% group_by(model) %>% mutate( # 累积判断是否已经出现病例数小于1的节点 after_first_below1 = cumsum(cases < 1) >= 1, cases2 = if_else(after_first_below1, 0, cases) ) %>% ungroup()
如果需要保留首次小于1的原值,仅将该节点之后的数值置0,可修改判断条件为:
after_first_below1 = cumsum(lag(cases < 1, default = FALSE)) >= 1
原方案失败原因
- 第一种方案
- 仅处理了存在病例数小于1的模型,从未跌破1的模型不会被纳入规则
- for循环每次都基于原始数据集修改,没有留存前一次循环的修改结果,最终仅最后一个循环对应的模型规则生效
- 第二种方案
replace()仅匹配单个符合条件的行,无法将规则覆盖到符合条件行之后的所有行lag()仅读取原始数据的上一行值,不会将已经修改为0的数值纳入后续判断逻辑
效果验证
可以用以下构造的测试数据验证效果:
trial.df <- data.frame( model = rep(1:3, each =5), time = rep(1:5, 3), cases = c(1.2,1.1,0.8,1.3,1.5, 0.9,1.4,1.2,1.1,0.7, 1.3,1.5,1.2,1.4,1.1) )
运行代码后输出符合预期:
- 模型1第3个时间点首次小于1,后续所有值置0
- 模型2第1个时间点就小于1,所有值置0
- 模型3全程大于1,数值无修改
内容的提问来源于stack exchange,提问作者SR1614
相关产品推荐
相关产品推荐

