Преобразование категориальных данных в числовые векторы

Я пытаюсь преобразовать вектор - «Многолетний опыт» с несколькими тысячами наблюдений в числовое значение. Потенциальные ответы для «лет опыта» кодируются как «от 0 до 1», «от 1 до 2», «от 2 до 3» и т. Д. Вплоть до «от 39 до 40».

Я думал, что простая команда factor предоставит числовой вектор. Рассмотрим следующие примеры ответов для многолетнего опыта, когда я ищу, чтобы 1 было связано с ответом «0 к 1»:


YE<- c("8 to 9", "2 to 3", "1 to 2"...."39 to 40"
YE_adjusted<- as.numeric(factor(YE, c(1,2,3,4,5,6,7....40)
View(YE_adjusted)

Мы просматриваем YE_adjusted все, что я вижу, это вектор значений NA. Какое правильное решение для получения желаемого результата?


person Sud Sampath    schedule 05.08.2019    source источник
comment
Вы не можете увидеть вектор нулевых значений, R не поддерживает это. Он поддерживает (а) list из NULL и (б) вектор NA (и я подозреваю, что он у вас есть). Второй аргумент factor - это уровни, которые ему назначаются, и они обычно начинаются с уникальных значений в векторе символов, а не с произвольных чисел (у вас может быть больше уровней, чем в данных, но не наоборот). Поэтому, если вы замените c(1,2,3,...,40) на unique(YE), он будет работать без ошибок, но я не знаю, что вам нужно.   -  person r2evans    schedule 06.08.2019
comment
Может, тебе просто нужно as.integer(factor(YE))?   -  person r2evans    schedule 06.08.2019
comment
Похоже, вы пытаетесь сохранить свои данные. Вы смотрели cut?   -  person r2evans    schedule 06.08.2019
comment
привет @ r2evans, вы совершенно правы, он возвращает список значений Na. Я попробовал следующее в этом примере и получил разные результаты, которые я не искал. data<- c("1 to 2", "7 to 8", "7 to 8", "0-1"...."36 to 37") #up to 40 years of experience values possible. f_test<- as.numeric(factor(data, unique(data))) f_test_2<- as.integer(factor(data)) View(f_test) View(f_test_2) Ни одна из этих двух строк не возвращает то, что я ищу, а именно числовой вектор (2,8,8,1 ... 37). Фактически View f_test_2 возвращает 2,38,38 ...   -  person Sud Sampath    schedule 06.08.2019
comment
Сложно помочь, SudSampath, так как я не знаю, как выглядят ваши настоящие данные. Я не знаю, должны ли 2, 8, 8, 1 применяться к ... idk. Судя по звукам, вы либо проводите распределительный тест, либо ... хорошо, вы только что приняли ответ H1. Я рада, что ты нашел что-то полезное. :-)   -  person r2evans    schedule 06.08.2019
comment
Спасибо за помощь! На самом деле я пытался преобразовать эти строковые ответы за многолетний опыт в числовую форму, чтобы я мог построить уравнение Минсера для оценки заработной платы.   -  person Sud Sampath    schedule 06.08.2019


Ответы (1)


Вы можете попробовать использовать mixedsort() из пакета gtools, чтобы установить уровни фактора перед принуждением к числовому.

library(gtools)

YE_adjusted<- as.numeric(factor(YE, levels = unique(mixedsort(YE))))

Это должно гарантировать, что уровни факторов сохраняются в разумном порядке перед преобразованием:

factor(YE, levels = unique(mixedsort(YE)))

[1] 8 to 9   2 to 3   1 to 2   39 to 40
Levels: 1 to 2 2 to 3 8 to 9 39 to 40

Если вы хотите сделать это в базе, вы можете попробовать следующее. Если ваши данные соответствуют приведенным примерам, они должны работать.

as.numeric(factor(as.numeric(sub("(\\d+).*", "\\1", YE))))
person 27 ϕ 9    schedule 05.08.2019
comment
Это было здорово! Спасибо! Но есть ли способ использовать базу R для решения этого вопроса? - person Sud Sampath; 06.08.2019