You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的模型,从未跌破1的模型不会被纳入规则
  • for循环每次都基于原始数据集修改,没有留存前一次循环的修改结果,最终仅最后一个循环对应的模型规则生效
  1. 第二种方案
  • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:24:03