Вы используете 0 в качестве индекса в первом элементе, поэтому выравнивание нарушено.
y[x]
[1] "a" "b" "c" NA "a" "b" "c" NA
Итак
> y[0]
character(0)
> y[1]
[1] "a"
> y[2]
[1] "b"
> y[3]
[1] "c"
Итак, длина y [x] отличается от длины х.
То, что вы хотите, это
> ifelse(x==2, y[x+1], x)
[1] "0" "1" "c" "3" "4" "1" "c" "3" "4"
, но только если первый элемент всегда равен 0.
Старый ответ Поскольку
x <- c(0, 1:4, 1:4)
возвращает
[1] 0 1 2 3 4 1 2 3 4
поэтому x==2
возвращает
1] FALSE FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE
так что для y = letters[1:3]
ifelse(x==2, y[x], x)
Вы получитебуквы в третьей и седьмой позициях.
В документации для ifelse говорится, что если один вектор будет слишком коротким, он будет переработан, что, как вы ожидаете, будет c("a","b","c","a","b","c","a")
.
Однако, когда я пытаюсь
ifelse(x==3, y[x], x)
Я получаю
[1] "0" "1" "2" NA "4" "1" "2" NA "4"
Что говорит мне, что переработка не работает так, как я ожидал.
Так что это номинальная причина, по которой вы получаете результат.Причина, по которой это работает так, - это то, чего я сейчас не знаю, но если я это выясню, я добавлю к этому ответу.Я подозреваю, что это связано с преобразованием в строку.
Просто глядя на y[x]
Я получаю
[1] "a" "b" "c" NA "a" "b" "c" NA
Что, кстати, только длина 8, хотя х есть длина9.
Так что это вообще не имеет отношения к ifelse (), это действительно другая проблема с утилизацией.