如果可能的话,我想用tidyverse标记我的第一个排名最高的值。
假设以下数据
test = tibble(group=c(1,1,1,1,2,2,2,2), values = c(1,2,3,4,7,6,5,2))
我现在想标记第一个最高值,分别是第1组的3和4以及第2组的7和6,得出:
# A tibble: 8 x 3
group values marker
<dbl> <dbl> <lgl>
1 1 1 FALSE
2 1 2 FALSE
3 1 3 TRUE
4 1 4 TRUE
5 2 7 TRUE
6 2 6 TRUE
7 2 5 FALSE
8 2 2 FALSE
我考虑过对它们进行排名,而不是进行比较以获取布尔值或使用purrr,但我不知道该怎么做。
答案 0 :(得分:2)
按“组”分组后,rank
个“值”检查sort
个“ n”个tail
元素是%in%
个rank
创建逻辑vector
library(tidyverse)
test %>%
group_by(group) %>%
mutate(marker = dense_rank(values),
marker = marker %in% tail(sort(marker), 2))
或直接在order
上使用%in%
,tail
test %>%
group_by(group) %>%
mutate(marker = values %in% tail(values[order(values)], 2))
或
test %>%
group_by(group) %>%
mutate(marker = dense_rank(values) > n()-2)
或者可以使用data.table
library(data.table)
setDT(test)[order(values), marker := values %in% tail(values, 2), group]
或者按“分组”分组后的另一种选择是,获得top_n
行(n
-指定为2,wt
作为“值”),right_join
在创建“ TRUE”的“ marker”列之后,然后使用replace
NA
个FALSE
元素创建原始数据集
test %>%
group_by(group) %>%
top_n(2, values) %>%
mutate(marker = TRUE) %>%
right_join(test) %>%
mutate(marker = replace_na(marker, FALSE))