Как проверить, находится ли каждый элемент в столбце значений между значениями в двух других столбцах?

#r #dataframe #operators

Вопрос:

Это может быть очень запутанный способ задать этот вопрос. У меня есть столбец «результаты», который я хочу проверить на основе статистики предыдущих результатов, а именно рассчитанных минимальных и максимальных значений. Если значение в столбце результат находится между соответствующими минимальными и максимальными значениями, я хочу присвоить ему значение «1» в четвертом столбце с именем Within_range, а если нет, то «0». Я пробовал использовать реляционные операторы (<,>)

 df$Within_Range <- if(df$Result > df$Min amp; df$Result < df$Max){"1"} else {"0"}
 

и получил это:
В if (df$Результат > df$Мин и df$Результат > :
условие имеет длину > 1, и будет использоваться только первый элемент

R, похоже, не понравилось, что я попытался использовать несколько условий, поэтому я попытался использовать between()

 df$Within_Range <- if(between(df$Result,df$Min,df$Max)){"1"} else {"0"}
 

и я получил это:
Ошибка: Ожидание одного значения: [экстент=20511].

Вот несколько примеров кода:

 Result <- 1:5
Min <- c(2,1,2,3,4)
Max <- c(3,4,5,8,7)
df <- data.frame(Result, Min, Max)
 

Извините, если это глупый вопрос; Я все еще новичок в R, и часы поиска на форумах R не принесли ничего полезного… Я застрял.

Ответ №1:

between не векторизуется для аргументов left , right . Нам нужны операторы сравнения

 df$Within_Range <- with(df,  (Result > Min amp; Result < Max))
 

ПРИМЕЧАНИЕ: Измените значение >= или <= если диапазон должен также включать минимальные, максимальные значения


Кроме того, в первом фрагменте кода if/else это не нужно по нескольким причинам

  1. Он не векторизован, т. е. ожидает ввода длины 1 и вывода логического вектора длины 1 ( df$Result а другие столбцы, очевидно, имеют length значение больше 1).
  2. Выходные данные TRUE/FALSE операторов сравнения сохраняются в виде 1/0 значений. Итак, нам просто нужно принудить его к бинарному as.integer или

Комментарии:

1. Спасибо вам за ваш ответ! То, как вы это объяснили, теперь имеет гораздо больше смысла. Этот код был запущен, однако созданный столбец «Within_Range» содержит только ложные данные, что неверно…

2. @mika, пожалуйста, проверьте Result тип своей колонки. Это числовое значение

Ответ №2:

 df %>% mutate(Within_Range = between(Result, Min, Max))

## OutPut
  Result Min Max Within_Range
1      1   2   3        FALSE
2      2   1   4         TRUE
3      3   2   5         TRUE
4      4   3   8         TRUE
5      5   4   7         TRUE