满足条件后创建手动Bin

时间:2018-10-12 23:05:47

标签: r binning

使用剪切后,给出如下所示的数据帧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

如果容器之间“重要性”列中的值之差小于N(比如0.2),我想替换“ Binned_X”列

重要的一点是,由于X是一个连续变量,因此,如果我们要合并某些垃圾箱,则它们必须按顺序排在下一个位置(例如,如果我们有垃圾箱“ 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循环,比较“重要性”列中的值,并且当差值小于0.2时,获取上一行的“,”(用于开盘价)之前的值,以及该值在“,”(用于结束值)之后,将其设置为包含被减去的“重要性”中这两个值中任何一个的所有行。

所以,按照这种方法,我将使用2个For循环,并且我知道在R中这是一种效率很低的方法...

我真的很感谢任何建议

1 个答案:

答案 0 :(得分:1)

我在另一个问题上看到您使用了包装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))