Выбор только первых n значений из сгруппированных / отсортированных данных - PullRequest
1 голос
/ 25 апреля 2020

У меня есть фрейм данных с 4 группами (определяется категориями «a» и «b» в столбце 1 и категориями «X» и «Y» в столбце 2). Я хочу ранжировать атрибуты в столбце 3 по их значениям в столбце 4, но конкретно в группах в столбцах 1 и 2 (AX, AY, BX, BY), а затем выбрать только верхние n (например, n = 2) значения из каждой группы.

arrange(col1, col2, desc(col4)) работает для упорядочения данных, но поскольку данные технически не сгруппированы, такие функции, как top_n, возвращают только верхние n значений всего списка. Я думал об использовании slice_max, но не могу установить бета-версию dplyr из GitHub в моей сети с ограниченным доступом. Каков наилучший подход?

Исходные данные:

col1    col2    col3    col4
a       X       pat     1
b       Y       dog     2
b       X       leg     3
a       X       hog     4                   
b       Y       egg     5
a       Y       log     6
b       X       map     7
b       Y       ice     8
b       X       mat     9
a       Y       sat     10

arrange(col1, col2, desc(col4)) дает

col1    col2    col3    col4
a       X       hog     4
a       X       pat     1
a       Y       sat     10
a       Y       log     6                   
b       X       mat     9
b       X       map     7
b       X       leg     3
b       Y       ice     8
b       Y       egg     5
b       Y       dog     2

, но я не могу понять, как отфильтровать это до 2 верхних значения.

(пример кода ввода ниже)

col1 <- c('a','b','b','a','b','a','b','b','b','a')
col2 <- c('X','Y','X','X','Y','Y','X','Y','X','Y')
col3 <- c('pat','dog','leg','hog','egg','log','map','ice','mat','sat')
col4 <- c(1,2,3,4,5,6,7,8,9,10)

df <- data.frame(col1,col2,col3,col4)

colA <- c('a','a','a','a','b','b','b','b','b','b')
colB <- c('X','X','Y','Y','X','X','X','Y','Y','Y')
colC <- c('hog','pat','sat','log','mat','map','leg','ice','egg','dog')
colD <- c(4,1,10,6,9,7,3,8,5,2)

df1 <- data.frame(colA,colB,colC,colD)

1 Ответ

1 голос
/ 25 апреля 2020

Мы можем использовать top_n после группировки по 'colA', 'colB'

library(dplyr)
df %>% 
     group_by(colA, colB) %>%
     top_n(2)
...