#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 (
df$Result
а другие столбцы, очевидно, имеютlength
значение больше 1). - Выходные данные 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