Создать ручную корзину после выполнения условия - PullRequest
0 голосов
/ 13 октября 2018

Учитывая 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

Я хотел бы заменить столбец "Binned_X", если разница значений в столбце "Важность" между ячейками равнаниже, чем N (скажем, 0,2)

Важно сказать, что, поскольку 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 для циклови я знаю, что в R было бы действительно неэффективнымау ...

Буду очень признателен за любые предложения

1 Ответ

0 голосов
/ 13 октября 2018

По другому вопросу я видел, что вы использовали 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))
...