Пометить верхние записи подмножеств в R с помощью tidyverse - PullRequest
2 голосов
/ 02 мая 2019

Я бы хотел пометить мое первое значение с самым высоким рейтингом маркером, используя тидиверс - если это возможно.

Допустим, следующие данные

test = tibble(group=c(1,1,1,1,2,2,2,2), values = c(1,2,3,4,7,6,5,2))

Теперь я хотел бы отметить первые верхние значения, которые будут значениями 3 и 4 для группы 1 и 7 и 6 для группы 2, получая:

# 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 Ответ

2 голосов
/ 02 мая 2019

После группировки по 'group', либо rank 'значения' проверяют, что sort ed 'n' tail элементы %in% rank ed для создания логических 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]

Или другой вариант после группировки по 'group', получить top_n строк (n - указано как 2, wt как «значения»), right_join с исходным набором данных после создания маркера 'столбец' ИСТИНЫ, а затем replace элементов NA с FALSE

test %>%
   group_by(group) %>% 
   top_n(2, values) %>%
   mutate(marker = TRUE) %>%
   right_join(test) %>%
   mutate(marker = replace_na(marker, FALSE))
...