离散化连续变量以保留零

Discretizing a continous variable keeping out zeros

我想离散化包含连续变量的列。

数据看起来像;

c(0,25,77,423,6,8,3,65,32,22,10,0,8,0,15,0,10,1,2,4,5,5,6)

我想通过离散化将数字转换为分类数字,但零代表不同的类别。有时直接离散化可以使不同的数字保持零。

我想如果我把零排除在外然后离散化我的愿望就会实现。但是在数据框列中,由于索引,我不能这样做:

这里是一个例子dput()输出

structure(list(dummy_column = c(0, 25, 77, 423, 6, 8, 3, 65, 
32, 22, 10, 0, 8, 0, 15, 0, 10, 1, 2, 4, 5, 5, 6)), class = "data.frame", row.names = c(NA, 
-23L))

例如,如果我想使用 2 个休息时间,类别应该是;零和其他3个离散化的,共4类。如果我可以编写函数来离散化可以直接使用 dplyr::mutate()

创建的列,那应该会更好

提前致谢。

如果你有像下面这样的中断c(20,50),你可以尝试cut离散化dummy_column,例如

breaks <- c(20, 50)
df %>%
  mutate(discrete = cut(dummy_column, c(-1, 0, breaks, max(dummy_column))))

这给出了

   dummy_column discrete
1             0   (-1,0]
2            25  (20,50]
3            77 (50,423]
4           423 (50,423]
5             6   (0,20]
6             8   (0,20]
7             3   (0,20]
8            65 (50,423]
9            32  (20,50]
10           22  (20,50]
11           10   (0,20]
12            0   (-1,0]
13            8   (0,20]
14            0   (-1,0]
15           15   (0,20]
16            0   (-1,0]
17           10   (0,20]
18            1   (0,20]
19            2   (0,20]
20            4   (0,20]
21            5   (0,20]
22            5   (0,20]
23            6   (0,20]

如果我没理解错的话,你的目标是在离散化时将“0”作为一个单独的类别。这是一个使用 arules::discretize 来创建可以完成此任务的新函数的解决方案:

library(arules)
#> Loading required package: Matrix
#> 
#> Attaching package: 'arules'
#> The following objects are masked from 'package:base':
#> 
#>     abbreviate, write
library(tidyverse)

df <- structure(list(dummy_column = c(0, 25, 77, 423, 6, 8, 3, 65, 
                                32, 22, 10, 0, 8, 0, 15, 0, 10, 1, 2, 4, 5, 5, 6)), class = "data.frame", row.names = c(NA, 
                                                                                                                        -23L))

discretize_keep <- function(vec, keep, ...) {
    vec2 <- vec
    vec2[vec2==keep] <- NA
    dsc <- arules::discretize(vec2, ...)
    fct_explicit_na(dsc, na_level = str_glue("[{keep}]"))
}

df %>%
    mutate(discrete_column = discretize_keep(dummy_column, keep = 0, breaks = 3))
#>    dummy_column discrete_column
#> 1             0             [0]
#> 2            25        [15,423]
#> 3            77        [15,423]
#> 4           423        [15,423]
#> 5             6          [6,15)
#> 6             8          [6,15)
#> 7             3           [1,6)
#> 8            65        [15,423]
#> 9            32        [15,423]
#> 10           22        [15,423]
#> 11           10          [6,15)
#> 12            0             [0]
#> 13            8          [6,15)
#> 14            0             [0]
#> 15           15        [15,423]
#> 16            0             [0]
#> 17           10          [6,15)
#> 18            1           [1,6)
#> 19            2           [1,6)
#> 20            4           [1,6)
#> 21            5           [1,6)
#> 22            5           [1,6)
#> 23            6          [6,15)