Я не могу понять, почему присваивание ifelse
не возвращает весь объект, который я пытаюсь передать.
Ниже я смотрю, находится ли штат Техас в векторе названий штатов (в моем реальном коде я ищу уникальные названия штатов в шейп-файле). Затем, если Техас есть в этом списке названий штатов, назначьте новому объекту (states_abb) сокращения для Техаса и Нью-Мексико. В противном случае назначьте для States_abb аббревиатуры Калифорнии и Невады.
Я знаю из эта почта и ?ifelse
что...
ifelse returns a value with the same shape as test which is filled with elements selected from either yes or no depending on whether the element of test is TRUE or FALSE.
Итак, в моем первом примере ниже я понимаю, что возвращается только CA.
states <- c("California", "Nevada")
(states_abb <- ifelse("Texas" %in% states, c("NM", "TX"), c("CA", "NV")))
# [1] "CA"
Но во втором примере ниже я предварительно определил объект canv_abb. Почему весь этот объект не передается? Даже если это вектор символов, это его собственный объект, верно? Разве весь этот "пакет" не должен пройти?
txnm_abb <- c("NM", "TX")
canv_abb <- c("CA", "NV")
(states_abb <- ifelse("Texas" %in% states, txnm_abb, canv_abb))
# [1] "CA"
Я ценю любое понимание того, почему это происходит. А может кто-нибудь предложить решение, чтобы я мог присвоить ОБЕ аббревиатуры?
Ключевое слово здесь «одинаковая длина». Если вы примените ifelse
, и вход, и выход должны иметь одинаковую длину. В вашем случае это 1:2. В этом случае будет рассчитан только первый.
Смотрите ?ifelse
:
'ifelse
возвращает значение той же формы, что и тест.
решение использует классическую структуру if else:
states <- c("California", "Nevada")
states_abb <- if ("Texas" %in% states) {
c("NM", "TX")
} else {
c("CA", "NV")
}
> states_abb
[1] "CA" "NV"
ifelse
здесь неправильный инструмент. Вы используете ifelse
, когда у вас есть вектор логических тестов, и вы хотите создать новый вектор одинаковой длины. У вас есть логический тест Один, но вы хотите, чтобы ваш вывод был вектором.
То, что вы описываете, лучше обрабатывается пунктом if
и else
:
states_abb <- if ("Texas" %in% states) txnm_abb else canv_abb
states_abb
#> [1] "CA" "NV"
Чтобы попытаться понять, как работает ifelse
, рассмотрите следующие входные и выходные данные:
condition <- c(TRUE, FALSE, FALSE)
input1 <- c("A", "b", "C")
input2 <- c("1", "2", "3")
result <- ifelse(condition, input1, input2)
result
#> [1] "A" "2" "3"
Вы увидите, что ifelse
— это векторизованный сокращенный способ написания следующего цикла, который на удивление часто встречается при обработке данных:
result <- character(3)
for(i in 1:length(condition)) {
result[i] <- if (condition[i]) input1[i] else input2[i]
}
result
#> [1] "A" "2" "3"
Обратите внимание, что это нет, что вы пытаетесь сделать в своем собственном коде.
хорошо, большое спасибо @Allan Cameron! Я ценю объяснение и решение. Я буду более осторожен, когда использую ifelse. Ваше здоровье.
Подтолкнул меня к посту TarJae! Хороший ответ.