Преобразование вектора с непрерывными и категориальными значениями в вектор факторов - PullRequest
0 голосов
/ 19 ноября 2018

Допустим, у меня есть вектор, который содержит значения от 0 до 12 (непрерывные), представляющие возраст, а также 2 значения токенов 97 и 99, которые обозначают «не отвечал» и «отсутствует» соответственно, поэтому что-то вроде:

v <- sample(c(sample(1:12, 95, replace = TRUE), 99, 99, 97, 99, 99))

Я хочу преобразовать этот числовой вектор в вектор факторов, где я дискретизирую непрерывные значения от 1 до 12 в три ячейки с одинаковыми интервалами (т. Е. [1,4), [4, 8), [8,12]), чтобы в итоге я получилвектор факторов с 5 уровнями, три для бункеров и 2 для 97 и 99.Я пытаюсь найти лучший / самый эффективный способ сделать это очень обычно в R.

Обновление

Чтобы выразиться более конкретно, я хочу функциюnumeric2factor, который принимает вектор значений vec, вектор токенов tokens, диапазон непрерывных значений, заданных start и end, и функцию дискретизации discrFunc.numeric2factor преобразует vec = v из вышеприведенного примера в вектор факторов.

Предположим, что end меньше самых низких значений токенов (например, end=12, а самое низкое значение токена является чем-то вроде97), поэтому нет никакого перекрытия между непрерывными и категориальными значениями.

discrFunc делает что-то вроде возврата точек отсечения (согласно некоторому методу дискретизации) только непрерывных значений из vec.

1 Ответ

0 голосов
/ 20 ноября 2018

Вот начало, может понадобиться адаптироваться к вашим конкретным потребностям:

set.seed(1);v <- sample(c(sample(1:12, 95, replace = TRUE), 99, 99, 97, 99, 99))
table(v)
# 1  2  3  4  5  6  7  8  9 10 11 12 97 99 
# 5  6  9  7 13 10  4  8  8 11 10  4  1  4 

numeric2factor <- function(x, start, end, bins){
  res <- character(length = length(x))
  ix1 <- x >= start & x <= end
  res[ ix1 ] <- as.character(cut(x[ ix1 ], seq(min(x[ ix1 ]) - 1, max(x[ ix1 ]),
                                               length.out = bins + 1)))
  res[ !ix1 ] <- x[ !ix1 ]
  as.factor(res)

}

table(numeric2factor(v, min(v), 12, 3))
# (0,4]  (4,8] (8,12]     97     99 
#    27     35     33      1      4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...