满足条件后创建手动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::cut
和 Hmisc::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))
给定一个数据帧 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::cut
和 Hmisc::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))