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

基于阈值对行分组:含NA值的R语言分组问题求助

解决基于阈值分组并处理NA值的问题

问题根源

  1. R中缺失值是大写的NA,你写的小写na会被识别为未定义变量,首先要修正数据定义。
  2. 用TB < thresh比较时,NA的比较结果为NA,而cumsum遇到NA会直接返回全NA,这是你得到全NA结果的核心原因。
  3. 需求中NA要作为第一个组的首个元素,需要单独处理这个逻辑。

修正后的完整代码

library(dplyr)

# 修正数据定义(小写na改为大写NA)
TB <- c(NA, 21706, 297, 1078, 61, 75, 6464, 10649, 3480, 7823, 3233, 83, 3646, 60)
thresh <- 316
dat <- tibble(TB)  # 转换为数据框

# 执行分组逻辑
dat <- dat %>%
  mutate(
    # 处理NA:将NA的阈值比较结果设为FALSE,避免cumsum出错
    below_thresh = ifelse(is.na(TB), FALSE, TB < thresh),
    # 分组规则:NA作为第1组,后续每次前一个元素低于阈值时开启新组
    # 确保低于阈值的元素和其上方的元素归为同一组
    grp = 1 + cumsum(lag(below_thresh, default = FALSE))
  )

# 查看结果
print(dat)

结果说明

运行后得到的分组结果完全符合需求:

  • NA单独作为第1组的首个元素
  • 每个低于阈值的元素会和它上方的连续高于阈值的元素归为一组,比如21706(高于阈值)和297(低于阈值)同属组1,1078(高于阈值)和61、75(低于阈值)同属组2,以此类推。

关键逻辑解释

  • ifelse(is.na(TB), FALSE, TB < thresh):把NA对应的阈值比较结果强制设为FALSE,避免NA进入cumsum导致全NA。
  • lag(below_thresh, default = FALSE):获取前一个元素是否低于阈值,默认第一个元素的前一个为FALSE,确保NA所在行是第1组。
  • 1 + cumsum(...):累计前一个元素低于阈值的次数,加1后得到组号,实现分组的连续递增。

内容的提问来源于stack exchange,提问作者mere

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:15:43