将dplyr的第一和第二等级以可变顺序进行比较

时间:2019-01-21 20:22:37

标签: r dplyr

请考虑以下数据:

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的{​​{1}}-ci

在上面的示例中,如果最高均值是最高均值,则foo将获胜,因为(3-0.5)>(1.2 + 0.3)

相反,如果最低均值是最佳均值,则C将不会获胜,因为(1 + 0.5)>(1.2-0.3)

我目前已实现此功能,假设最高均值决定了获胜者:

A

我想要做的是使该功能更通用。如果我想将其用于平均收益最低的数据,则必须用…替换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的相当笨拙的函数,但是一旦我必须将其平均值与第二行的意思是,我被卡住了。

1 个答案:

答案 0 :(得分:1)

我发现的一种方法是将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