如何在R中对连续变量分箱并保留数值特征(转为区间中点)
连续数值变量分箱并保留数值类型(替换为区间中点)
你需要对连续数值变量做分箱处理,但不想转成因子类型,而是把每个原始值替换为对应分箱区间的中点,方便后续绘图和数值运算。比如用cut_width生成的(20,22]区间对应中点21,(14,16]区间对应中点15。
方法1:基于已生成的分箱子变量计算中点
先按你的方式生成分箱因子,再提取区间上下界计算中点:
data(mtcars) library(tidyverse) # 先生成分箱子变量 mtcars <- mtcars %>% mutate(mpg_binned = cut_width(mpg, 2, closed = "right", boundary = 10)) # 提取区间上下限并计算中点 mtcars <- mtcars %>% mutate( mpg_bin_mid = map_dbl(mpg_binned, function(x) { # 提取区间中的数字部分 bounds <- str_extract_all(x, "\\d+\\.?\\d*") %>% unlist() %>% as.numeric() # 计算区间中点 (bounds[1] + bounds[2]) / 2 }) ) # 查看结果 as_tibble(mtcars %>% select(mpg, mpg_binned, mpg_bin_mid))
输出示例:
# A tibble: 32 × 3 mpg mpg_binned mpg_bin_mid <dbl> <fct> <dbl> 1 21 (20,22] 21 2 21 (20,22] 21 3 22.8 (22,24] 23 4 21.4 (20,22] 21 5 18.7 (18,20] 19 6 18.1 (18,20] 19 7 14.3 (14,16] 15 8 24.4 (24,26] 25 9 22.8 (22,24] 23 10 19.2 (18,20] 19 # … with 22 more rows
方法2:直接计算中点(无需先生成分箱子变量)
如果不需要保留分箱因子标签,直接通过数学计算得到中点更高效,逻辑和cut_width的分箱规则完全对齐:
data(mtcars) library(tidyverse) # 定义分箱参数 boundary_val <- 10 width_val <- 2 mtcars <- mtcars %>% mutate( # 直接计算对应区间的中点 mpg_bin_mid = boundary_val + width_val * (floor((mpg - boundary_val) / width_val) + 0.5), # 可选:如果需要分箱标签,再生成因子变量 mpg_binned = cut_width(mpg, width_val, closed = "right", boundary = boundary_val) ) # 查看结果 as_tibble(mtcars %>% select(mpg, mpg_binned, mpg_bin_mid))
两种方法生成的mpg_bin_mid都是数值类型,完全满足后续绘图和数值运算的需求,其中方法2避免了字符串解析步骤,处理大数据集时速度更快。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

