【问题标题】:Discretizing a continous variable keeping out zeros离散化连续变量保持零
【发布时间】:2021-08-10 19:35:29
【问题描述】:

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

数据看起来像;

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()创建的列,那应该会更好

提前致谢。

【问题讨论】:

    标签: r dplyr discretization


    【解决方案1】:

    如果我理解正确,您的目标是在离散化时将“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)
    

    【讨论】:

    • 是的,完全是我寻求的答案。谢谢你优雅的解决方案。
    【解决方案2】:

    如果您有如下中断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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      相关资源
      最近更新 更多