R语言按分组判断因子列是否统一并生成分组标识方法
使用dplyr的分组聚合逻辑即可快速实现两个需求,完整可复现代码如下:
# 加载依赖包 library(tidyverse) # 构造示例数据 df <- tibble( group_id = factor(c("A", "A", "A","B","B","B","C")), status = factor(c("complete","complete", NA, "complete", "not complete", "complete", "complete")) ) # 数据处理 df_result <- df %>% # 按group_id分组,所有计算在分组内执行 group_by(group_id) %>% mutate( # 计算uniform_status uniform_status = ifelse( is.na(status), NA, # 统计分组内去除NA后的status唯一值数量,等于1则为统一 n_distinct(status, na.rm = TRUE) == 1 ), # 计算status_group status_group = ifelse( # 仅当分组status不统一且当前行status不为空时分配编号 uniform_status == FALSE & !is.na(status), # 按status值分配编号,相同status编号一致 dense_rank(status), NA ) ) %>% # 取消分组 ungroup() # 查看结果 print(df_result)
运行后输出结果和你给出的预期完全一致:
# A tibble: 7 × 4 group_id status uniform_status status_group <fct> <fct> <lgl> <int> 1 A complete TRUE NA 2 A complete TRUE NA 3 A NA NA NA 4 B complete FALSE 1 5 B not complete FALSE 2 6 B complete FALSE 1 7 C complete TRUE NA
逻辑说明
- 先按
group_id对数据分组,所有统计计算都在各自分组内独立执行 uniform_status列:当前行status为缺失值时直接返回NA,否则统计分组内去除缺失值后的status唯一值数量,数量为1说明取值统一返回TRUE,否则返回FALSEstatus_group列:仅当分组status不统一且当前行status不为缺失值时,用dense_rank()给不同的status分配连续编号,同一status编号相同,其余场景返回NA。如果需要自定义编号顺序,提前调整status的因子水平顺序即可。
内容的提问来源于stack exchange,提问作者Rasul89
相关产品推荐
相关产品推荐

