2016-09-26 3 views
0

Я очень новичок в R и в настоящее время борется за изучение языка. Я пытаюсь создать новую переменную с тремя уровнями (если это имеет смысл). Я пытаюсь показать рост < = 0%, < 1%, и> = 1% все в одной и той же новой переменной (дайте мне знать, если это возможно).Создание новой переменной с уровнями в R

До сих пор я попытался это:

pincome$perctchng<- ifelse(pincome$perctchng<=0,ifelse(pincome$perctchng<1, 
       ifelse(pincome$perctchng>=1,"level 1","level 2","level 3"))) 

Это код, который я пытался. Я знаю, что это неправильно, но любые советы - правильное направление приветствуется.

Спасибо!

+0

Try 'pincome $ perctchng <- IfElse (pincome $ perctchng <= 0, "level 1", ifelse (pincome $ perctchng <1, "level 2", "level 3")) ' –

+1

Возможный дубликат [Вложенный оператор ifelse в R] (http: // stackoverflow .com/вопросы/18012222/вложенная -ifelse-statement-in-r) –

+0

Я считаю, что бесконечно легче понять такие вложенные утверждения (особенно ifelse statements!), если используется правильный отступ. У вас есть правильная идея, вы просто споткнулись с порядком скобок. – Chrisss

ответ

3

Вложенные ifelse заявления почти никогда не являются правильными ответами. Их трудно читать и хрупки. Ваша цель - преобразовать непрерывное значение (числовые значения в perctchng) в категориальное значение («уровень 1» и т. Д.). Функция R в cut идеально подходит для этого:

pincome <- data.frame(perctchng = c(-2, -1, 0, 1, 2, 5)) 

    perctchng 
1  -2 
2  -1 
3   0 
4   1 
5   2 
6   5 

pincome$level <- cut(pincome$perctchng, c(-Inf, 0, 1, Inf), c('level 1', 'level 2', 'level 3')) 

    perctchng level 
1  -2 level 1 
2  -1 level 1 
3   0 level 1 
4   1 level 2 
5   2 level 3 
6   5 level 3 
+1

К сожалению, использование 'cut' здесь не делает то, что запросил OP. По умолчанию «cut» использует левые открытые, прямые закрытые интервалы. Таким образом, уровни <= 0%, <=1%, and > 1%, в то время как OP запрашивает <= 0%, <1%, and > = 1%. Таким образом, '1' будет принадлежать« уровню 3 », а не« уровню 2 », как в этом ответе. – Uwe

+1

Существует аргумент 'cut'' includeLowest', который контролирует это поведение. – JDL

0

Ваше решение почти хорошо ваш синтаксис просто не правильно:

library(dplyr) 

pincome <- data.frame(perctchng = c(-2, -1, 0, 1, 2, 5)) 

pincome %>% 
    mutate(perctchng_level = ifelse(perctchng <= 0, "level 1", 
          ifelse(perctchng < 1, "level 2", 
            ifelse(perctchng >= 1, "level 3", NA)))) 

результаты:

perctchng perctchng_level 
1  -2   level 1 
2  -1   level 1 
3   0   level 1 
4   1   level 3 
5   2   level 3 
6   5   level 3 
Смежные вопросы