首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对连续变量进行离散化,避免出现零值

对连续变量进行离散化,避免出现零值
EN

Stack Overflow用户
提问于 2021-05-21 22:48:52
回答 2查看 39关注 0票数 0

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

数据看起来像这样;

代码语言:javascript
复制
c(0,25,77,423,6,8,3,65,32,22,10,0,8,0,15,0,10,1,2,4,5,5,6)

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

我想如果我保留零,那么离散化我的愿望就会实现。但是在dataframe列中,由于索引的原因,我不能这样做:

以下是一个dput()输出示例

代码语言:javascript
复制
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()创建的列,那就更好了

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-05-21 23:18:03

如果我理解正确的话,您的目标是在离散化时将"0“作为一个单独的类别。下面是一个使用arules::discretize创建新函数的解决方案,该函数可以完成此任务:

代码语言:javascript
复制
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)
票数 1
EN

Stack Overflow用户

发布于 2021-05-21 23:01:42

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

代码语言:javascript
复制
breaks <- c(20, 50)
df %>%
  mutate(discrete = cut(dummy_column, c(-1, 0, breaks, max(dummy_column))))

这给了我们

代码语言:javascript
复制
   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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67639161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档