Мы можем проверить это на примере данных:
set.seed(100)
data = data.frame(revenues=rnbinom(100,mu=1000,size=1),
dimension=sample(letters[1:2],100,replace=TRUE))
Во-первых, как правильно указал @DarrenTsai, вам нужно указать столбец для выполнения top_n (). Во-вторых, когда вы используете top_n, он идет в порядке убывания и принимает записи с рангом 1-10:
data %>% top_n(10,revenues)
revenues dimension
1 4191 b
2 1916 a
3 2397 b
4 1895 a
5 2013 a
6 2351 b
7 3889 b
8 2503 a
9 3909 a
10 2779 b
Это означает, что вам не нужно упорядочивать свои данные, и я не уверен, что вы намерены принять его по убыванию или по возрастанию. Давайте предположим, что он по убыванию:
data %>% group_by(dimension) %>% top_n(10,revenues)
Обратите внимание, этот код, приведенный выше, примет 10 лучших значений, то есть в событиях связей (скажем, у вас 2 ранга 1), вы получите более 10. Для Пример в этих данных:
# A tibble: 21 x 2
# Groups: dimension [2]
revenues dimension
<dbl> <fct>
1 1663 a
2 1663 a
3 1753 a
4 1849 a
5 1856 a
6 1869 a
7 1895 a
8 1916 a
9 2013 a
10 2503 a
# … with 11 more rows
Мы можем видеть, правильны ли результаты, это то, что мы ожидаем:
unlist(tapply(data$revenues,data$dimension,function(i)-sort(-i)[1:10]))
a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 b1 b2 b3 b4 b5 b6
3909 2503 2013 1916 1895 1869 1856 1849 1753 1663 4191 3889 2779 2397 2351 1479
b7 b8 b9 b10
1414 1340 1327 1274
И используя group_by + top_n()
:
data %>% group_by(dimension) %>% top_n(10,revenues) %>%
arrange(dimension,desc(revenues)) %>% pull(revenues)
[1] 3909 2503 2013 1916 1895 1869 1856 1849 1753 1663 1663 4191 3889 2779 2397
[16] 2351 1479 1414 1340 1327 1274
Вы видите, что 1663 берется дважды, что дает 21 значение.
Если вам нужно абсолютно 20 (по 10):
data %>% arrange(desc(revenues)) %>%
group_by(dimension) %>% do(head(.,10))