2015-04-02 3 views
0

все.IF/THEN/ELSE в R

Надеюсь, это простой вопрос синтаксиса. Я пытаюсь создать новую переменную в таблице в R, которая скажет «1», если мой пациент находится в возрасте, на который я смотрел, или «0» - нет. Возраст меня интересует между 2-155. Код работает без ошибок, но он не работает. Когда я смотрю на мой стол, новая переменная будет говорить 1, даже несмотря на то, age4 является 158 Вот что у меня есть:

table$newvar <- if (table$age4>=2 && table$age4 <=155) {table$newvar=1} else {table$newvar=0} 

Любая помощь приветствуется! Заранее спасибо!

+1

R не САС (ни SPSS). Вам нужно изучить основные учебные пособия и работать с примерами. Если какой-либо текст, который вы используете для этой цели, не объясняет различия btwn 'if' и' ifelse', тогда вы должны его выбросить. (Кроме того, использование «=» неверно.) –

ответ

4

Два изменение должно быть сделано:

  1. Используйте Векторизованную ifelse() функции для создания новых данных столбцов.
  2. Использовать векторный логический оператор & при объединении результатов сравнений.

table <- data.frame(age4=seq(1,200,10)); 
table$newvar <- ifelse(table$age4>=2 & table$age4<=155,1,0); 
table; 
## age4 newvar 
## 1  1  0 
## 2 11  1 
## 3 21  1 
## 4 31  1 
## 5 41  1 
## 6 51  1 
## 7 61  1 
## 8 71  1 
## 9 81  1 
## 10 91  1 
## 11 101  1 
## 12 111  1 
## 13 121  1 
## 14 131  1 
## 15 141  1 
## 16 151  1 
## 17 161  0 
## 18 171  0 
## 19 181  0 
## 20 191  0 

Причина ваш код не работает потому, что if оператор и оператор && не векторизации. Оператор && проверяет только первый элемент каждого вектора операндов и возвращает только одноэлементный вектор, представляющий результат логического-И, на эти два входных значения. Оператор if всегда ожидает одноэлементный вектор для его условного выражения и выполняет if-ветку, если этот элемент равен true, или else-branch, если false.

Если использовать вектор многоэлементного как условные в if заявлении, вы получите предупреждение:

if (c(T,F)) 1 else 0; 
## [1] 1 
## Warning message: 
## In if (c(T, F)) 1 else 0 : 
## the condition has length > 1 and only the first element will be used 

Но по какой-то причине, вы сделать не получить предупреждение, если вы используете кратна-элементный вектор в качестве операнда && (или ||):

c(T,F) && c(T,F); 
## [1] TRUE 

Вот почему ваш код появился на успех (я имею в виду, что не печатали любое предупреждающее сообщение), но он фактически не делал то, что предназначалось.

0

При использовании в арифметических TRUE и FALSE стать 1 и 0 так:

transform(table, newvar = (age4 >= 2) * (age4 <= 155)) 

Они также работают:

transform(table, newvar = as.numeric((age4 >= 2) & (age4 <= 155))) 

transform(table, newvar = ((age4 >= 2) & (age4 <= 155)) + 0) 

transform(table, newvar = ifelse((age4 >= 2) & (age4 <= 155), 1, 0)) 

transform(table, newvar = (age4 %in% 2:155) + 0) # assuming no fractional ages 
Смежные вопросы