用tidyverse标记R中子集的顶部条目

时间:2019-05-02 14:33:50

标签: r tidyr purrr

如果可能的话,我想用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,但我不知道该怎么做。

1 个答案:

答案 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

NAFALSE元素创建原始数据集
test %>%
   group_by(group) %>% 
   top_n(2, values) %>%
   mutate(marker = TRUE) %>%
   right_join(test) %>%
   mutate(marker = replace_na(marker, FALSE))