You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:15:08