首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dplyr为每个类别选择前10个值

问dplyr为每个类别选择前10个值
EN

Stack Overflow用户
提问于 2020-04-10 19:33:50
回答 3查看 2.3K关注 0票数 1

我正在尝试过滤一个包含n个类别的n行的数据框。我希望每个类别的dimension值都按另一个列revenues排序,然后选择每个dimension的前10个值,并去掉其余的值。

我尝试了下面的狙击手,但它似乎没有达到我想要的效果:

代码语言:javascript
复制
data <-  tbl_df(data) %>%
  arrange(revenues) %>%
  group_by(dimension) %>%
  top_n(10)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-10 19:39:25

代码语言:javascript
复制
data <-  tbl_df(data) %>%
  group_by(dimension) %>%
  arrange(revenues, .by_group = TRUE) %>%
  top_n(10)
票数 3
EN

Stack Overflow用户

发布于 2020-04-10 20:21:54

代码语言:javascript
复制
data <-  tbl_df(data) %>%
  group_by(dimension) %>%
  arrange(desc(revenues),.by_group=TRUE) %>%
  top_n(10,revenues)
票数 1
EN

Stack Overflow用户

发布于 2020-04-10 22:10:51

我们可以用一个示例数据来测试它:

代码语言:javascript
复制
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的条目:

代码语言:javascript
复制
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

这意味着你不需要排列你的数据,我不确定你打算以降序还是升序来处理它。让我们假设它是降序的:

代码语言:javascript
复制
data %>%  group_by(dimension) %>% top_n(10,revenues)

注意,上面的代码将获取前10个值,这意味着在平局事件中(假设您有2个排名第一),您将获得10个以上的值。例如,在此数据中:

代码语言:javascript
复制
# 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

我们可以看到结果是否正确,这是我们所期望的:

代码语言:javascript
复制
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():

代码语言:javascript
复制
 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个):

代码语言:javascript
复制
data %>% arrange(desc(revenues)) %>%
group_by(dimension) %>% do(head(.,10))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61139430

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档