满足条件后创建手动Bin

Create manual Bin after condition is satisfied

给定一个数据帧 df 在使用切割后看起来像这样:

      X  Binned_X Dependent     Importance
1  -236      -236         0   -0.25131443
2  -236      -236         1   -0.25131443
3  -236      -236         1   -0.25131443
4  -236      -236         1   -0.25131443
5  -236      -236         0   -0.25131443
6  -236      -236         1   -0.25131443
7  -236      -236         0   -0.25131443
8   320 [244,485]         1    0.06713930
9   320 [244,485]         0    0.06713930
10  320 [244,485]         1    0.06713930
11  320 [244,485]         1    0.06713930
12  244 [244,485]         1    0.06713930
13  244 [244,485]         1    0.06713930
14  244 [244,485]         0    0.06713930
15  244 [244,485]         1    0.06713930
16  485 [244,485]         0    0.06713930
17  485 [244,485]         1    0.06713930
18  485 [244,485]         1    0.06713930
19  485 [244,485]         1    0.06713930
20  485 [244,485]         1    0.06713930
21  485 [244,485]         0    0.06713930
22  485 [244,485]         0    0.06713930
23  485 [244,485]         0    0.06713930
24  485 [244,485]         1    0.06713930
25   25  [25,244)         1    0.04879016
26   25  [25,244)         1    0.04879016
27   25  [25,244)         1    0.04879016
28   25  [25,244)         1    0.04879016
29   25  [25,244)         0    0.04879016
30   25  [25,244)         1    0.04879016
31   25  [25,244)         1    0.04879016
32  108  [25,244)         1    0.04879016
33  108  [25,244)         0    0.04879016
34  108  [25,244)         0    0.04879016
35  108  [25,244)         0    0.04879016
36  108  [25,244)         1    0.04879016
37  108  [25,244)         1    0.04879016
38  108  [25,244)         0    0.04879016

如果 bin 之间列 "Importance" 中的值的差异低于 N(比方说 0.2)

,我想替换列 "Binned_X"

重要的是要说明,由于 X 是一个连续变量,如果我们想要合并一些 bin,它们需要按顺序紧随其后(例如,如果我们有 bin“1、2 和 3”,“ 1”只能与“2”合并,“2”只能与“1”或“3”合并,“3”只能与“2”合并)。所以在这个特定的例子中,bin "-236" 只能与 "[25,244)" 合并,而 bin "[25,244)" 可以与 "-236" 和 "[244,485]" 等合并。

期望的输出是这样的:

      X  Binned_X
1  -236      -236
2  -236      -236
3  -236      -236
4  -236      -236
5  -236      -236
6  -236      -236
7  -236      -236
8   320  [25,485]
9   320  [25,485]
10  320  [25,485]
11  320  [25,485]
12  244  [25,485]
13  244  [25,485]
14  244  [25,485]
15  244  [25,485]
16  485  [25,485]
17  485  [25,485]
18  485  [25,485]
19  485  [25,485]
20  485  [25,485]
21  485  [25,485]
22  485  [25,485]
23  485  [25,485]
24  485  [25,485]
25   25  [25,485)
26   25  [25,485)
27   25  [25,485)
28   25  [25,485)
29   25  [25,485)
30   25  [25,485)
31   25  [25,485)
32  108  [25,485)
33  108  [25,485)
34  108  [25,485)
35  108  [25,485)
36  108  [25,485)
37  108  [25,485)
38  108  [25,485)

因为每列的 类 看起来是这样的:

> lapply(df_Ex_binned,class)
$`X`
[1] "numeric"

$Binned_X
[1] "ordered" "factor" 

$Dependent
[1] "numeric"

我的方法是提取列 "Binned_X" 的开头编号(“(”或“[”和“,”之间的数字),这样我就可以将其更改为数字,然后进行排序它(为了我之前说的连续变量的目的)。

然后,我会做一个For循环比较列"Importance"中的值,当差异小于0.2时,获取前一行的“,”(用于开始值)之前的值,以及“,”之后的值(用于结束值)并将其设置为包含 "Importance" 中被减去的这两个值中任何一个的所有行。

因此,在这种方法中,我将使用 2 个 For 循环,而且我知道在 R 中这将是一种非常低效的方式...

如果有任何建议,我将不胜感激

我在另一个问题上看到你使用了 pakage cutr 所以我也会在那里使用它,最后添加 base::cutHmisc::cut2 的解决方案(他们稍微不同的输出)。

# devtools::install_github("moodymudskipper/cutr")
library(cutr)
threshold <- .02
cutpoints <- with(df[order(df$X),], X[c(TRUE,abs(diff(Importance))>threshold)])
transform(df,Binned_X = smart_cut(X,cutpoints))
#       X Binned_X Dependent  Importance
# 1  -236     -236         0 -0.25131443
# 2  -236     -236         1 -0.25131443
# 3  -236     -236         1 -0.25131443
# 4  -236     -236         1 -0.25131443
# 5  -236     -236         0 -0.25131443
# 6  -236     -236         1 -0.25131443
# 7  -236     -236         0 -0.25131443
# 8   320 [25,485]         1  0.06713930
# 9   320 [25,485]         0  0.06713930
# 10  320 [25,485]         1  0.06713930
# 11  320 [25,485]         1  0.06713930
# 12  244 [25,485]         1  0.06713930
# 13  244 [25,485]         1  0.06713930
# 14  244 [25,485]         0  0.06713930
# 15  244 [25,485]         1  0.06713930
# 16  485 [25,485]         0  0.06713930
# 17  485 [25,485]         1  0.06713930
# 18  485 [25,485]         1  0.06713930
# 19  485 [25,485]         1  0.06713930
# 20  485 [25,485]         1  0.06713930
# 21  485 [25,485]         0  0.06713930
# 22  485 [25,485]         0  0.06713930
# 23  485 [25,485]         0  0.06713930
# 24  485 [25,485]         1  0.06713930
# 25   25 [25,485]         1  0.04879016
# 26   25 [25,485]         1  0.04879016
# 27   25 [25,485]         1  0.04879016
# 28   25 [25,485]         1  0.04879016
# 29   25 [25,485]         0  0.04879016
# 30   25 [25,485]         1  0.04879016
# 31   25 [25,485]         1  0.04879016
# 32  108 [25,485]         1  0.04879016
# 33  108 [25,485]         0  0.04879016
# 34  108 [25,485]         0  0.04879016

使用base::cut

cutpoints <- with(df[order(df$X),], c(X[c(TRUE,abs(diff(Importance))>threshold)],max(X)))
transform(df,Binned_X = cut(X,cutpoints,include.lowest = TRUE,right = FALSE))

使用Hmisc::cut2

library(Hmisc)
cutpoints <- with(df[order(df$X),], X[c(TRUE,abs(diff(Importance))>threshold)])
transform(df,Binned_X = cut2(X,cutpoints))