在R语言中基于层级条件为数据框添加字母分类列
解决方案:按分组匹配优先级条件生成COL4列
这里有一个基于dplyr的实现方案,完全符合你要求的「同一Groups+Names下COL4值一致」以及给定的优先级条件:
核心思路
因为要求同一Groups和Names组合下的所有行对应相同的COL4,所以不能逐行判断,需要先按分组评估该组是否满足最高优先级的条件,再将结果映射到组内所有行。我们可以把你给出的8个条件简化为3个层级的判断:
- 最高优先级:组内任意一行满足「COL1 >=1 且 COL2 >=0.05 且 COL3 >=0.05」→ COL4 =
L - 次优先级:组内任意一行满足以下任一条件 → COL4 =
M:- 「COL1 ==0 且 COL2 >=0.05 且 COL3 >=0.05」(条件2)
- 「COL1 >=1 且 COL2 >=0.05 且 COL3 <0.05」(条件3)
- 「COL1 >=1 且 COL2 <0.05 且 COL3 <0.05」(条件4)
- 剩余所有情况(对应你的条件5-8)→ COL4 =
P
R代码实现
library(dplyr) # 导入你的数据 df <- structure(list(Groups = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L), .Label = c("G1", "G2", "G3"), class = "factor"), Names = structure(c(1L, 1L, 1L, 4L, 4L, 5L, 6L, 7L, 2L, 1L, 1L, 4L, 4L, 6L, 7L, 8L, 3L, 6L), .Label = c("SP1", "Sp12", "SP12", "SP2", "SP3", "SP5", "SP6", "SP7"), class = "factor"), COL1 = c(1L, 1L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), COL2 = c(0.4, 0.004, 0.004, 0.4, 0.004, 0.005, 0.4, 0.008, 0.004, 0.05, 0.4, 0.004, 0.004, 0.004, 0.003, 0.56, 0.004, 0.87), COL3 = c(0.5, 0.005, 0.005, 0.005, 0.5, 0.006, 0.006, 0.002, 0.005, 0.6, 0.6, 0.005, 0.005, 0.005, 0.002, 0.76, 0.003, 0.767)), class = "data.frame", row.names = c(NA, -18L)) # 生成COL4列 df_result <- df %>% group_by(Groups, Names) %>% mutate( # 检查组内是否有满足条件1的行 meets_cond1 = any(COL1 >= 1 & COL2 >= 0.05 & COL3 >= 0.05), # 检查组内是否有满足条件2/3/4的行 meets_cond2_4 = any( (COL1 == 0 & COL2 >= 0.05 & COL3 >= 0.05) | (COL1 >= 1 & COL2 >= 0.05 & COL3 < 0.05) | (COL1 >= 1 & COL2 < 0.05 & COL3 < 0.05) ), # 根据优先级赋值COL4 COL4 = case_when( meets_cond1 ~ "L", meets_cond2_4 ~ "M", TRUE ~ "P" ) ) %>% # 移除中间临时列(如果不需要的话) select(-meets_cond1, -meets_cond2_4) %>% ungroup() # 查看最终结果 print(df_result)
结果匹配验证
运行代码后得到的COL4列完全符合你的预期:
- G1 SP1组因为存在满足条件1的行,所有行COL4为
L - G1 SP5组符合条件3,COL4为
M - G1 SP2组属于条件6/7的情况,COL4为
P - G2 SP7组符合条件2,COL4为
M - 所有其他分组也严格遵循你给出的规则标记
内容的提问来源于stack exchange,提问作者Grendel
相关产品推荐
相关产品推荐

