如何在R语言cut函数中指定断点,将18及以上标记为Adult?
如何正确用cut函数将年龄分为Minor和Adult(≥18为Adult)
嘿,这个问题我之前也踩过坑!你用cut(ages, breaks=2)的时候,R会默认把数据分成等距的两个区间,而且cut函数默认是左开右闭的区间规则(也就是(a,b]),这就导致18刚好被划到左边的区间里,被标记成了Minor。要精准控制阈值,咱们得手动指定断点,而不是让R自动分割。
方法一:手动指定断点并调整区间闭合方向
这是最贴合你需求的方式,直接把18作为分界点,通过right=FALSE参数让区间变成左闭右开([a,b)):
ages <- c(17, 18, 16, 20, 22, 23) age_group <- cut(ages, breaks = c(-Inf, 18, Inf), labels = c('Minor', 'Adult'), right = FALSE)
- 解释:
right=FALSE时,第一个区间是[-Inf, 18),对应小于18的Minor;第二个区间是[18, Inf),对应大于等于18的Adult,这样18就会被正确分到Adult组里。
验证一下结果:
> age_group [1] Minor Adult Minor Adult Adult Adult Levels: Minor Adult
方法二:保持默认区间规则,调整断点阈值
如果你不想修改right参数(默认是right=TRUE,左开右闭),可以把断点设为17,这样(17, Inf]就包含了所有≥18的年龄:
age_group <- cut(ages, breaks = c(-Inf, 17, Inf), labels = c('Minor', 'Adult'))
这个方法也能得到正确结果,但不如第一种直观,毕竟我们的阈值是18,直接用18作为断点更清晰。
方法三:不用cut,用ifelse+factor更直白
对于这种简单的二分类场景,其实可以不用cut,直接用ifelse配合factor函数实现,代码更易懂:
age_group <- factor(ifelse(ages >= 18, "Adult", "Minor"))
这个方法逻辑直接,一眼就能看懂“≥18标记为Adult,否则为Minor”,适合快速实现需求。
内容的提问来源于stack exchange,提问作者Alex T
相关产品推荐
相关产品推荐

