Вы можете думать о ifelse()
в R как о функции, которая работает с 3 векторами:
- вектор логических значений (ИСТИНА, ЛОЖЬ).Это
1==3 | 2==2 | 3==3
part. - вектор элементов, который будет выбран, когда первый вектор равен TRUE.Это
a <- 100
part. - вектор элементов, который будет выбран, когда первый вектор равен FALSE.Это
a <- 1000
часть.
И все 3 вектора должны иметь одинаковую длину.
Вот краткая демонстрация:
vec1 <- 1:10 > 3 & 1:10 < 7
> vec1
[1] FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE FALSE
vec2 <- LETTERS[1:10]
> vec2
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
vec3 <- letters[1:10]
> vec3
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
Функция ifelse()
объединит vec2
и vec3
в новый вектор, в котором элементы взяты из vec2
и vec3
в зависимости от значения vec1
.
ifelse(vec1, vec2, vec3)
[1] "a" "b" "c" "D" "E" "F" "g" "h" "i" "j"
Toлучше посмотреть, как это работает, здесь все в табличной форме (предложено @Gregor).
> rbind(vec1, vec2, vec3, result=ifelse(vec1, vec2, vec3))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
vec1 "FALSE" "FALSE" "FALSE" "TRUE" "TRUE" "TRUE" "FALSE" "FALSE" "FALSE" "FALSE"
vec2 "A" "B" "C" "D" "E" "F" "G" "H" "I" "J"
vec3 "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"
result "a" "b" "c" "D" "E" "F" "g" "h" "i" "j"
Проблема с подходом, который вы попробовали, заключается в том, что ifelse()
было неправильно понято.Вы попытались присвоить значения вместо предоставления 2-го и 3-го векторов для функции ifelse()
.
В вашем случае решение, все еще использующее ifelse()
, будет состоять в том, чтобы сделать это два раза:
a <- ifelse(x=="cat" | x=="dog" | x=="horse", 100, 500)
b <- ifelse(x=="cat" | x=="dog" | x=="horse", 200, 1000)
ПРИМЕЧАНИЕ: в приведенном выше примере вместо вектора было указано одно значение 100
.Но R расширит свою длину, чтобы соответствовать длине первого вектора.Поэтому допустимы отдельные значения, но они расширяются до вектора под капотом.