基于阈值对行分组:含NA值的R语言分组问题求助
解决基于阈值分组并处理NA值的问题
问题根源
- R中缺失值是大写的
NA,你写的小写na会被识别为未定义变量,首先要修正数据定义。 - 用
TB < thresh比较时,NA的比较结果为NA,而cumsum遇到NA会直接返回全NA,这是你得到全NA结果的核心原因。 - 需求中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
相关产品推荐
相关产品推荐

