Преобразование непрерывных переменных в двоичные переменные

Я пытаюсь преобразовать непрерывные переменные в двоичные столбцы категориальных переменных в R с помощью функции cut. Код

    xyz=rnorm(20,3,1)
    xcut=cut(xyz,breaks=c(2,3))

Это преобразует xyz в категориальные переменные, но я хочу иметь три двоичных столбца с именами столбцов «‹ 2 »,« 2-3 »и«> 3 »и, скажем, если xyz[1] равно 1,5, то значения первой строки равны 1, 0 и 0, и мне это нужно для всех 20 значений xyz. Я не хотел использовать циклы for и if для создания этой матрицы 20x3, я уже мог сделать это с помощью xyz в числовой форме. Мне интересно, есть ли более короткий способ сделать это?


person A Doe    schedule 07.05.2016    source источник
comment
Я бы предпочел использовать model.matrix здесь: model.matrix(~0 + xcut)   -  person user20650    schedule 07.05.2016


Ответы (2)


Мы можем использовать 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)
person akrun    schedule 07.05.2016

Одно из решений - использовать неконтролируемую дискретизацию. Он полностью основан на наблюдаемом распределении непрерывного атрибута. Вот 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)
person Andrii    schedule 16.09.2018