Сравнение первого и второго рангов с dplyr с переменным порядком - PullRequest
0 голосов
/ 21 января 2019

Рассмотрим следующие данные:

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"), но как только мне нужно сравнить это среднее со средним значением второго ряда, я застрял.

1 Ответ

0 голосов
/ 21 января 2019

Один из способов, который я нашел, - использование функции nth с отрицательными индексами.Таким образом, по умолчанию порядок может возрастать, а выбор первого и второго или первого и второго до последнего зависит от того, является ли индекс положительным или отрицательным:

higher_is_better = TRUE
multiplier = ifelse(higher_is_better, -1, 1)

data %>% 
summarize(
  has_winner = ifelse(
    (nth(mean, multiplier, order_by = mean) - nth(ci, multiplier, order_by = mean)) -
      (nth(mean, 2 * multiplier, order_by = mean) + nth(ci, 2 * multiplier, order_by = mean))
    > 0, TRUE, FALSE
  )
)

Например:

data %>% 
  summarize(
    first_mean = nth(mean, multiplier, order_by = mean),
    second_mean = nth(mean, 2 * multiplier, order_by = mean)
  )

Дает:

# A tibble: 1 x 2
  first_mean second_mean
       <dbl>       <dbl>
1          3         1.2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...