如何基于多条件为每个id分配Class(A/B/C)?
R语言分类标注解决方案
步骤1:准备示例数据
先把你提供的示例数据转换成R可识别的数据框:
# 创建示例数据 df <- data.frame( id = paste0("id", 1:4), var1 = c(1, 0, 0, 1), var2 = c(10, 20, 15, 30), var3 = c(1, 0, 0, 1), var4 = c(0, 2, 1, 1), var5 = c(1.5, 2.4, 3.5, 2.1), row.names = NULL )
步骤2:统计Q1、Q2符合数量
逐个变量判断是否符合Q1或Q2条件,再统计每行的符合次数:
library(dplyr) # 未安装先运行 install.packages("dplyr") df <- df %>% # 生成每个变量的Q1/Q2符合标记 mutate( # Q1条件判断 q1_var1 = var1 == 1, q1_var2 = var2 > 15, q1_var3 = var3 == 1, q1_var4 = var4 == 2, q1_var5 = var5 < 2.0, # Q2条件判断(无对应规则的变量直接设为FALSE) q2_var1 = FALSE, q2_var2 = var2 >= 15 & var2 < 25, q2_var3 = FALSE, q2_var4 = var4 == 1, q2_var5 = FALSE ) %>% # 每行统计Q1、Q2的符合数量 mutate( q1_count = rowSums(select(., starts_with("q1_"))), q2_count = rowSums(select(., starts_with("q2_"))) )
步骤3:按规则标注Class
根据给定的分类规则,为每个id标记对应Class:
df <- df %>% mutate( Class = case_when( q1_count >= 2 ~ "A", (q1_count == 1 & q2_count >= 1) | q2_count >= 2 ~ "B", TRUE ~ "C" ) ) # 查看最终结果(保留核心列) df %>% select(id, var1:var5, Class)
结果验证
运行后示例数据的输出结果:
| id | var1 | var2 | var3 | var4 | var5 | Class |
|---|---|---|---|---|---|---|
| id1 | 1 | 10 | 1 | 0 | 1.5 | A |
| id2 | 0 | 20 | 0 | 2 | 2.4 | B |
| id3 | 0 | 15 | 0 | 1 | 3.5 | B |
| id4 | 1 | 30 | 1 | 1 | 2.1 | A |
完全匹配规则要求。
基础R版本(无需额外包)
如果不想使用dplyr,用基础R也能实现:
# 创建示例数据 df <- data.frame( id = paste0("id", 1:4), var1 = c(1, 0, 0, 1), var2 = c(10, 20, 15, 30), var3 = c(1, 0, 0, 1), var4 = c(0, 2, 1, 1), var5 = c(1.5, 2.4, 3.5, 2.1), row.names = NULL ) # 计算每行Q1、Q2符合数量 df$q1_count <- with(df, (var1 ==1) + (var2 >15) + (var3 ==1) + (var4 ==2) + (var5 <2.0)) df$q2_count <- with(df, 0 + (var2 >=15 & var2 <25) + 0 + (var4 ==1) + 0) # 标注Class df$Class <- ifelse(df$q1_count >=2, "A", ifelse((df$q1_count ==1 & df$q2_count >=1) | df$q2_count >=2, "B", "C")) # 查看结果 df[, c("id", "var1", "var2", "var3", "var4", "var5", "Class")]
内容的提问来源于stack exchange,提问作者JY J
相关产品推荐
相关产品推荐

