Использование ifelse в R, когда один из вариантов создает NA? - PullRequest
1 голос
/ 01 июля 2019

Я хочу векторизовать функцию, которая опирается на проверку условия и, в зависимости от того, является ли это условие ИСТИНА или ЛОЖЬ, возвращает результат одной из двух функций соответственно.Проблема в том, что, когда условие ЛОЖЬ, первая функция не может быть оценена.Затем ifelse возвращает правильные значения, но также выдает предупреждение.Я хотел бы создать функцию, которая не выдает предупреждения.

Я пробовал ifelse(), но она не работает.Я ожидал, что эта команда пропустит оценку первой функции, когда условие имеет значение FALSE.

Вот иллюстративный фрагмент кода R

p = c(-1,1,-1,1,-1,-1,-1,1)

ifelse(p>0, sqrt(p), p^2)

, который возвращает

[1] 1 1 1 1 1 1 1 1
Warning message:
In sqrt(p) : NaNs produced

Как видите, результат верный, но по какой-то причине он оценивает функцию в первой функции, когда условие ЛОЖЬ.Таким образом, я хотел бы как-то избежать этой проблемы.

Ответы [ 2 ]

3 голосов
/ 01 июля 2019

Избежание через ifelse, вероятно, невозможно.Мое понимание процесса ifelse:

  1. Создание вектора значений на основе выражения в yes
  2. Создание вектора значений на основе выражения в no
  3. Используйте результат test, чтобы решить, будет ли каждый элемент из yes или no.

Если ошибка произойдет либо в yes, либо no, ifelse не удастся.

Чтобы обойти это, вам нужно оценивать выражения только там, где они будут успешными.(например, в ответе Акруна, вариант которого приведен здесь для полноты)

p = c(-1,1,-1,1,-1,-1,-1,1)

condition <- p > 0

result <- numeric(length(p))

result[g1] <- sqrt(p[condition])
result[!g1] <- p[condition]^2
2 голосов
/ 01 июля 2019

Мы можем создать вектор numeric и затем заполнить элементы, основываясь на условии, выдвинутом 'p'

out <- numeric(length(p))
out[p > 0] <- sqrt(p[p > 0])
out[p <= 0] <- p[p <= 0]^2

С ifelse нам нужно, чтобы все аргументы были одинаковыми length. Согласно ?ifelse

ifelse (тест, да, нет)

Вектор такой же длины и атрибутов (включая размеры и "класс") в качестве тестовых значений и значений данных из значений да или нет

Что происходит, так это то, что мы выполняем оба вычисления для всего вектора и заменяем значения 'p' на основании условия test. Для sqrt отрицательные значения определенно дают предупреждение и выводятся как NaN. Хотя элементы NaN не отображаются на выходе, предупреждение уже было напечатано. Предупреждение является дружественным, но может быть подавлено с помощью suppressWarnings

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...