使用剪切后,给出如下所示的数据帧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中这是一种效率很低的方法...
我真的很感谢任何建议
答案 0 :(得分:1)
我在另一个问题上看到您使用了包装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))