Ifelse присвоение не возвращает предварительно определенный вектор символов

Я не могу понять, почему присваивание 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"

Я ценю любое понимание того, почему это происходит. А может кто-нибудь предложить решение, чтобы я мог присвоить ОБЕ аббревиатуры?

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
0
32
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ключевое слово здесь «одинаковая длина». Если вы примените 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"

Подтолкнул меня к посту TarJae! Хороший ответ.

Allan Cameron 23.04.2022 13:26
Ответ принят как подходящий

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. Ваше здоровье.

ltlf653 23.04.2022 13:50

Другие вопросы по теме