使用dplyr按ID分组重分配信号标签:双标签ID用占优标签覆盖全组
标签规则处理dplyr实现方案
需求说明
每个ID记录了一系列信号标签,取值为"alpha"、"beta"和"unknown"。处理规则为:
- 若某个ID对应的标签仅有2种取值,将该ID下所有记录的标签替换为占比最高的主导标签,例如某ID的标签为
c("alpha", "alpha", "unknown"),处理后变为c("alpha", "alpha", "alpha") - 若ID对应的标签仅有1种、或同时存在3种取值,保留原有标签不变
测试数据集构造
library(tidyverse) # 数据准备(可直接使用下方构造的tbl对象) ID <- c(rep("A", 14), rep("B", 14), rep("C", 10), rep("D", 22), rep("E", 2)) series <- c(11, 3, 12, 2, 8, 2, 11, 8, 3, 2) label <- unlist( sapply(series, function(x) {case_when(x < 5 ~ rep("unknown", x), x >= 5 ~ case_when(x > 10 ~ rep("alpha", x), x <= 10 ~ rep("beta", x)) ) })) # 构造tbl对象 tbl <- tibble(ID = ID, label = label)
实现代码
tbl_processed <- tbl %>% group_by(ID) %>% mutate( # 统计当前ID的标签种类数 label_type_cnt = n_distinct(label), # 统计当前ID出现频次最高的主导标签 dominant_label = names(which.max(table(label))) ) %>% mutate( # 仅当标签种类为2时替换为统一主导标签 label = ifelse(label_type_cnt == 2, dominant_label, label) ) %>% # 移除计算过程的辅助列 select(-label_type_cnt, -dominant_label) %>% ungroup()
结果验证
可以通过以下代码查看各ID处理后的标签情况:
tbl_processed %>% group_by(ID) %>% summarise( 标签唯一值 = paste(unique(label), collapse = "、"), 总记录数 = n() )
运行后可得到预期结果:
- ID A、B的标签统一为
alpha - ID C的标签统一为
beta - ID D保留3种原有标签
- ID E保留唯一标签
unknown
内容的提问来源于stack exchange,提问作者SiH
相关产品推荐
相关产品推荐

