R语言如何对非二分类数值列调用cut函数分箱为对应分位数区间
解决方法
你可以直接在across()的列选择逻辑里加入二分类判断,不需要额外嵌套case_when,实现更简洁,也不会出现不同返回值类型冲突的问题:
library(dplyr) df %>% mutate(across( # 仅选择「是数值型且唯一值数量不等于2」的列,自动排除二分类数值列 .cols = ~ is.numeric(.x) && length(unique(.x)) != 2, # 按分位数切分,添加include.lowest=TRUE避免最小值被归为NA .fns = ~ cut(.x, breaks = quantile(.x, probs = seq(0, 1, 0.25)), include.lowest = TRUE) ))
如果你一定要用case_when实现判断逻辑,可以按下面的写法调整,注意二分类列的返回值类型要和cut返回的因子类型兼容,或者你也可以根据需要调整返回类型:
df %>% mutate(across(is.numeric, .fn = function(x) { case_when( # 二分类列直接返回原值(这里转成因子和cut返回类型保持一致,不需要可以改成返回x) length(unique(x)) == 2 ~ as.factor(x), # 非二分类连续变量做分位数切分 TRUE ~ cut(x, breaks = quantile(x, probs = seq(0, 1, 0.25)), include.lowest = TRUE) ) }))
说明
- 你原来的代码
cut(x, breaks = 4)是生成等宽区间,不是分位数区间,如果需要分位数区间必须传入quantile()计算得到的断点 - 第一种方案执行效率更高,仅对符合条件的列做处理,不会修改其他列的原始值
- 示例数据中的
College二分类列、Happy字符列都会保留原始值,仅Age、Weight两个连续数值列会被转成四分位区间因子
内容的提问来源于stack exchange,提问作者Eisen
相关产品推荐
相关产品推荐

