如何在R语言cut()函数中加入性别因素,按不同阈值划分Strength?
解决方案:按性别不同阈值划分Strength变量
要实现按性别使用不同阈值划分Strength的需求,核心是针对不同Gender值,分别应用对应的cut规则,以下是两种实用的实现方式:
基础R实现
首先构造你的数据框(方便复现测试):
Base <- data.frame( ID = 1:5, Gender = c(0,1,1,0,0), Strength = c(230,20,30,40,40) )
定义一个根据性别返回划分结果的函数,再用mapply逐行应用规则:
# 定义分类函数:根据Gender选择对应的划分阈值 classify_strength <- function(strength, gender) { if (gender == 1) { # Gender=1时,阈值为28:<=28标记为Stronger,>28标记为Weaker cut(strength, breaks = c(-Inf, 28, Inf), labels = c("Stronger", "Weaker")) } else { # Gender=0时,阈值为10:<=10标记为Stronger,>10标记为Weaker cut(strength, breaks = c(-Inf, 10, Inf), labels = c("Stronger", "Weaker")) } } # 给数据框添加新变量 Base$newvariable <- mapply(classify_strength, Base$Strength, Base$Gender)
运行后查看结果:
print(Base) # ID Gender Strength newvariable # 1 1 0 230 Weaker # 2 2 1 20 Stronger # 3 3 1 30 Weaker # 4 4 0 40 Weaker # 5 5 0 40 Weaker
tidyverse(dplyr)实现
如果你习惯用tidyverse工具链,可以用case_when实现条件化的cut操作:
library(dplyr) Base <- Base %>% mutate( newvariable = case_when( Gender == 1 ~ cut(Strength, breaks = c(-Inf, 28, Inf), labels = c("Stronger", "Weaker")), Gender == 0 ~ cut(Strength, breaks = c(-Inf, 10, Inf), labels = c("Stronger", "Weaker")), TRUE ~ NA_character_ # 处理未定义的Gender值(可选) ) )
关键说明
- 用
-Inf和Inf作为breaks的边界,可以覆盖所有可能的Strength数值(比如数据中230这种远大于阈值的情况) - 两种方法本质都是按Gender分组应用不同的cut规则,解决了你原代码中统一阈值的问题
内容的提问来源于stack exchange,提问作者MARCOS OLVERA ROJAS
相关产品推荐
相关产品推荐

