Рассмотрим следующие данные:
library(tidyverse)
data = tribble(
~foo, ~mean, ~ci,
"A", 1, 0.5,
"B", 1.2, 0.3,
"C", 3, 0.5
)
Я хочу выяснить, есть ли значительный победитель в случаях foo
, где "значительный победитель" означает, что mean
+ ci
изранжирование foo
ниже mean
- ci
второго ранга foo
.
В приведенном выше примере, если наибольшее среднее было лучшим, C
выиграет, поскольку (3 - 0,5)> (1,2 + 0,3) .
И наоборот, если наименьшее среднее значение было лучшим, A
не выиграет, поскольку (1 + 0,5)> (1.2 - 0.3) .
В настоящее время я реализовал эту функцию, предполагая, что наибольшее среднее определяет победителя:
data %>%
summarize(
has_winner = ifelse(
# lower bound of first place
(first(mean, order_by = desc(mean)) - first(ci, order_by = desc(mean))) -
# upper bound of second place
(nth(mean, 2, order_by = desc(mean)) + nth(ci, 2, order_by = desc(mean)))
> 0, TRUE, FALSE
)
)
Я хочу сделать эту функциюболее общий.Если бы я хотел использовать его для данных, в которых побеждает самое низкое среднее значение, мне пришлось бы заменить все экземпляры desc()
на ... ну, я не уверен.Там нет asc
, поэтому единственное, что я мог придумать, это полностью удалить desc()
и обернуть все в огромный if/else
.Очевидно, это не очень хорошо.
Как я мог сделать это вместо этого?Другими словами: когда у меня динамическое упорядочение, как мне легко сравнивать значения между первым и вторым?
Я знаю, что могу использовать top_n
с отрицательным индексом, чтобы получить победителяЯ мог бы написать довольно хитрую функцию, которая использует top_n(., 1, wt = mean) %>% pluck("mean")
, но как только мне нужно сравнить это среднее со средним значением второго ряда, я застрял.