将连续变量转换为二进制变量
Convert continuous variables to binary variables
我正在尝试使用 cut
函数将连续变量转换为 R 中分类变量的二进制列。密码是
xyz=rnorm(20,3,1)
xcut=cut(xyz,breaks=c(2,3))
这会将 xyz
转换为分类变量,但我想要三个二进制列,其中列名称为“<2”、“2-3”和“>3”,如果 xyz[1]
是 1.5,那么第一行的值是 1、0 和 0,我需要这个用于 xyz
的所有 20 个值。我不想使用 for 和 if 循环来创建这个 20x3 矩阵,我已经可以用 xyz
以数字方式完成它。我想知道是否有更短的方法来做到这一点?
我们可以使用table
xcut <- cut(xyz,breaks=c(-Inf,2,3, Inf), labels = c("<2", "2-3", ">3"))
table(seq_along(xcut), xcut)
数据
set.seed(24)
xyz <- rnorm(20,3,1)
解决方案之一是使用无监督离散化。它完全基于观察到的连续属性分布。这里有 2 个函数和用法示例:
# 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)
我正在尝试使用 cut
函数将连续变量转换为 R 中分类变量的二进制列。密码是
xyz=rnorm(20,3,1)
xcut=cut(xyz,breaks=c(2,3))
这会将 xyz
转换为分类变量,但我想要三个二进制列,其中列名称为“<2”、“2-3”和“>3”,如果 xyz[1]
是 1.5,那么第一行的值是 1、0 和 0,我需要这个用于 xyz
的所有 20 个值。我不想使用 for 和 if 循环来创建这个 20x3 矩阵,我已经可以用 xyz
以数字方式完成它。我想知道是否有更短的方法来做到这一点?
我们可以使用table
xcut <- cut(xyz,breaks=c(-Inf,2,3, Inf), labels = c("<2", "2-3", ">3"))
table(seq_along(xcut), xcut)
数据
set.seed(24)
xyz <- rnorm(20,3,1)
解决方案之一是使用无监督离散化。它完全基于观察到的连续属性分布。这里有 2 个函数和用法示例:
# 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)