请考虑以下数据:
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
的相当笨拙的函数,但是一旦我必须将其平均值与第二行的意思是,我被卡住了。
答案 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