Два изменение должно быть сделано:
- Используйте Векторизованную
ifelse()
функции для создания новых данных столбцов.
- Использовать векторный логический оператор
&
при объединении результатов сравнений.
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
Вот почему ваш код появился на успех (я имею в виду, что не печатали любое предупреждающее сообщение), но он фактически не делал то, что предназначалось.
R не САС (ни SPSS). Вам нужно изучить основные учебные пособия и работать с примерами. Если какой-либо текст, который вы используете для этой цели, не объясняет различия btwn 'if' и' ifelse', тогда вы должны его выбросить. (Кроме того, использование «=» неверно.) –