首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将连续变量转换为二进制变量

将连续变量转换为二进制变量
EN

Stack Overflow用户
提问于 2016-05-07 13:38:29
回答 2查看 4.6K关注 0票数 1

我试图用cut函数将连续变量转换为R中的分类变量的二进制列。代码是

代码语言:javascript
复制
    xyz=rnorm(20,3,1)
    xcut=cut(xyz,breaks=c(2,3))

这会将xyz转换为分类变量,但我希望有三个二进制列,其中列名为'<2‘、'2-3’和‘first 3 '>3’>,如果xyz[1]为1.5,那么第一行值为1、0和0,对于xyz的所有20个值,我都需要这样做。我不想使用for和if循环来创建这个20x3矩阵,我已经可以用xyz来实现它了。我想知道是否有更短的方法可以做到这一点?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-07 13:41:55

我们可以使用table

代码语言:javascript
复制
xcut <- cut(xyz,breaks=c(-Inf,2,3, Inf), labels = c("<2", "2-3", ">3"))
table(seq_along(xcut), xcut)

数据

代码语言:javascript
复制
set.seed(24)
xyz <- rnorm(20,3,1)
票数 4
EN

Stack Overflow用户

发布于 2018-09-16 12:57:43

其中一个解决方案是使用无监督离散化。它完全以连续属性的观测分布为基础。下面是两个使用示例的函数:

代码语言:javascript
复制
# 1. Functions

# 1.1. Equal-width discretization for a single attribute
disc_width <- function(v, k = 5) {
  w <- diff(r <- range(v)) / k
  c(r[1], seq(r[1] + w, r[2] - w, w), r[2])
}

# 1.2. Equal-frequency discretization for a single attribute
disc_freq <- function(v, k = 5) {
  v <- v[!is.na(v)]
  r <- range(v)
  f <- unique(quantile(v, seq(1/k, 1-1/k, 1/k))) 
  c(r[1], f, r[2])
}

# 2. Usage

# 2.1. Feature
x <- mtcars$mpg

# 2.2. Range of feature 'x'
range(x)

# 2.3. Equal-width discretization
disc_width(x, 4)

# 2.4. Equal-frequency discretization
disc_freq(x, 5)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37089250

复制
相关文章

相似问题

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