2013-04-07 2 views
1

Ниже приведена легкая версия того, что я пытаюсь сделать. У меня есть следующий вектор:Создание переменной из состояния с более чем двумя аргументами

wage = 1:10 # Generate a sequence from 1 to 10 

И я хочу, чтобы создать еще один вектор wage_level, что:

(я) wage_level является "low" если wage меньше 5

(б) wage_level является normal если wage равен 5

(iii) wage_level является high если wage больше 5

Я знаю, что могу использовать вложенные ifelse заявления, чтобы сделать это, однако, как я уже указывал ранее, это лишь упрощенная версия того, что я действительно хочу сделать, потому что у меня есть около 15 вариантов ,

Редактировать

Ответ приводится ниже использует функции cut(), которая на самом деле работает хорошо во многих случаях. Однако в моем случае это, похоже, не «работает». Ниже приводится подробное объяснение.

Я был в состоянии использовать функцию cut() создать wage_level вектор:

wage = runif(10, 1, 10) # Randomly generate 10 values between 1 and 10 

# Here I use the cut() function 
wage_level = cut(wage, 
       breaks = c(1, 4, 6, 10), 
       labels = c("low", "normal", "high"), 
       include.lowest = TRUE) 
> wage 
[1] 5.522422 4.793292 8.161671 5.480415 1.396909 3.403013 4.940242 7.762142 6.364159 4.603998 

> wage_level 
[1] normal normal high normal low low normal high high normal 
Levels: low normal high 

Теперь, давайте предположим, что я хочу использовать wage_level вектор для создания другого вектора (rating вектора) с помощью функции cut(). Условие для создания rating вектора выглядит следующим образом:

(я) rating является "1", если wage_level меньше "low"

(II) rating является 2, если wage_level равно "normal"

(III) rating составляет 3, если wage_level больше "high

Моя проблема t шляпа, используя функцию cut(), не будет делать вектор rating a numeric вектор будет значений по моему выбору. Следующий код не работает:

rating = cut(as.numeric(wage_level), 
       breaks = c(0, 1, 2, 3), 
       labels = c(1.2, 6.5, 8.9), 
       include.lowest = TRUE) 

> as.numeric(rating) 
[1] 2 2 3 2 1 1 2 3 3 2 

я в основном две проблемы здесь:

(я), я предпочел бы способ использовать фактические строки (например, «низкий», «нормальный» и " высокий ") вместо индексов меток

(ii) Значения в векторе rating не имеют ничего общего со значениями, указанными мной.

Любой другой способ достижения желаемого результата?

Большое спасибо за вашу помощь :)

+1

Возможно, вы ищете 'cut()' – ndoogan

+1

@ndoogan - это место. Я обнаружил, что, работая с большим количеством интервальных разрывов, полезно, чтобы 'breaks' и' labels 'были их собственными переменными, которые часто создавались с помощью 'seq' и' paste0' –

+0

@ndoogan. вопрос, не могли бы вы взглянуть? – SavedByJESUS

ответ

4
wage<-1:10 
cut(wage,breaks=c(0,4,5,10),include.lowest=T,labels=c("low","normal","high")) 
# [1] low low low low normal high high high high high 
#Levels: low normal high 

Что делать, если вектор не заказывали? Нет разницы:

wage <- runif(10,1,10) 
wage 
# [1] 8.535146 4.964819 7.228050 9.150132 6.369952 8.451137 8.022293 7.621226 
# [9] 1.070368 5.931904 

cut(wage,breaks=c(0,4,5,10),include.lowest=T,labels=c("low","normal","high")) 
# [1] high normal high high high high high high low high 

Хотя, заметьте, что normal коэффициент применяется к значениям между 4 и 5. Если вы действительно работает с реала, а затем ищет именно 5 может быть странный выбор.

+0

Большое спасибо за ваш ответ @ndoogan. Это очень полезно; однако, что мне делать, если данные не упорядочены в порядке возрастания, как в примере? Что делать, если у меня есть 'wage = runif (10, 1, 10)'? – SavedByJESUS

+1

Почему вы так думаете? – themel

+1

@SavedByJESUS ​​Я согласен с itel. Попробуй и посмотри. Он будет работать нормально. – ndoogan

Смежные вопросы