2017-01-18 2 views
-1

demo - это имя набора данных. Salary.Slab - это имя переменной. Я использую инструкцию if else внутри цикла для создания ведер.R-программирование - отсутствует значение, где требуется TRUE/FALSE: для цикла

head(demo$Salary.Slab) 
[1] 5 7 1 6 NA NA 

В колонке есть некоторые недостающие значения. Я отдаю себе отчет в том, что если оператор не работает со значениями NA, поэтому я написал следующий код, используя is.na

for(i in nrow(demo)) 
{ 
if(is.na(demo$Salary.Slab[i])){ 
demo$salary = "k" 

}else if(demo$Salary.Slab[i] == 1){ 
demo$salary = "Very Low" 

}else if(demo$Salary.Slab[i] == 3) { 
demo$salary = "Very Low" 

}else if(demo$Salary.Slab[i] == 4){ 
demo$salary = "Low" 

}else if(demo$Salary.Slab[i] == 5){ 
demo$salary = "Low" 

}else if(demo$Salary.Slab[i] == 6){ 
demo$salary = "Low" 
} 
} 

зарплату является новым переменным Я создаю для хранения значений ведер ("очень «низкий», «низкий» и т. д.)

Но когда я запускаю приведенный выше код, я получаю все значения «k» в каждой строке. В то время как я должен получить «k» только в местах, где Salary.Slab = NA и «очень низкий», где Salary.slab == 1 и так далее. Скажите, где я делаю неправильно.

+1

Если это будет 'демонстрационная $ зарплаты [я]' вместо 'демо $ salary' каждый раз? –

+0

Ваши условия в порядке, но присваивания у вас есть, например, 'demo $ зарплата =" k "', присваивать весь вектор, а не элемент 'i'th. Как говорит Андрей, добавьте '[i]' в строки назначения. Или см. 'Ifelse' для векторизованного метода. – Gregor

ответ

1

Вы должны Подмножеством результата, если/то:

for(i in 1:nrow(demo)) 
{ 
    if(is.na(demo$Salary.Slab[i])){ 
    demo$salary[i] = "k" 

    }else if(demo$Salary.Slab[i] == 1){ 
    demo$salary[i] = "Very Low" 

    }else if(demo$Salary.Slab[i] == 3) { 
    demo$salary[i] = "Very Low" 

    }else if(demo$Salary.Slab[i] == 4){ 
    demo$salary[i] = "Low" 

    }else if(demo$Salary.Slab[i] == 5){ 
    demo$salary[i] = "Low" 

    }else if(demo$Salary.Slab[i] == 6){ 
    demo$salary[i] = "Low" 
    } 
} 

В противном случае, он присваивает одно значение для всего столбца.

+3

Я не думаю, что он должен явно добавить что-то о is.na() == TRUE. 'is.na (demo $ Salary.Slab [i])' уже возвращает логическое значение. –

+0

По-прежнему то же самое происходит. –

+0

Ну, я запустил его несколько раз и получил желаемые результаты. Примечание: у вас есть 7 в наборе данных, но в цикле нет 7 опций. –

2

Вот короче решение:

# Vector of numbers or NAs 
Salary.Slab = c(5, 7, 1, 6, NA, NA) 

# bin by threshold 
ind = findInterval(Salary.Slab, c(0,4)) 

# deal with missing values (number of bins plus 1) 
ind[is.na(ind)] = 3; 

# Assign names by bin 
salary = c('Very Low', 'Low', 'k')[ind] 

# Here is the result: 
salary 

[1] "Low"  "Low"  "Very Low" "Low"  "k"  "k"  

# Combined with the original vector 
cbind(Salary.Slab, salary) 

    Salary.Slab salary  
[1,] "5"   "Low"  
[2,] "7"   "Low"  
[3,] "1"   "Very Low" 
[4,] "6"   "Low"  
[5,] NA   "k"  
[6,] NA   "k" 
Смежные вопросы