R语言按分组标记存在非连续present值的分组的实现方法
实现方案
核心判断逻辑:对每个分组,提取所有status为present对应的bin值,若「最大bin值 - 最小bin值 + 1」不等于present的总数量,说明present的bin不连续。如果分组内无present记录,可根据业务需求调整返回值,以下代码默认无present时标记为不连续,可自行修改逻辑。
前置准备
首先加载依赖包并构造示例数据:
library(dplyr) # 示例数据 x_df <- data.frame( group = c(rep("A",4),rep("B", 5), rep("C",4)), bin = c(1,2,3,4,1,2,3,4,5,1,2,3,4), status = c("absent", "present", "absent", "present", "absent", "present", "present", "absent", "absent", "absent", "absent", "present", "present") )
三种输出形式实现
1. 原数据框新增分组标记列
属于present不连续分组的所有行flag均标记为TRUE:
res1 <- x_df %>% group_by(group) %>% mutate(flag = { pres_bin <- bin[status == "present"] length(pres_bin) == 0 || (max(pres_bin) - min(pres_bin) + 1) != length(pres_bin) }) %>% ungroup()
2. 生成分组级汇总标记表
每个分组对应一行,标记该组是否符合present不连续的条件:
res2 <- x_df %>% group_by(group) %>% summarise(present_discontinuous = { pres_bin <- bin[status == "present"] length(pres_bin) == 0 || (max(pres_bin) - min(pres_bin) + 1) != length(pres_bin) })
3. 直接返回符合条件的分组名向量
res3 <- x_df %>% group_by(group) %>% summarise(is_dis = { pres_bin <- bin[status == "present"] length(pres_bin) == 0 || (max(pres_bin) - min(pres_bin) + 1) != length(pres_bin) }) %>% filter(is_dis) %>% pull(group)
示例数据运行后返回结果为 "A"。
内容的提问来源于stack exchange,提问作者srs025
相关产品推荐
相关产品推荐

