使用dplyr按组创建子集

时间:2018-08-16 15:34:53

标签: r dplyr

在这里,我有三个字段Dealer,Product,Freq的数据。 我的目的是创建一个数据,其中包含每个经销商的前2个销售。

我已经使用data.table做为波纹管了

library(data.table)
library(dplyr)

dt <- data.table(Dealer = c("A","B","A","A","B","A"),
                 Product = c("a","b","b","c","d","d"),
                 Freq = c(10,12,23,24,23,12))

dt[,.SD[order(Freq, decreasing = T)][seq_along(Freq) < 3], by = Dealer]

如何使用“ dplyr”包进行类似操作。

2 个答案:

答案 0 :(得分:2)

在这里,我按Dealer分组,然后在每个组中找到Freq的前2个值。

dt %>% group_by(Dealer) %>% top_n(2, Freq) %>% ungroup

# # A tibble: 4 x 3
#   Dealer Product  Freq
#   <fct>  <fct>   <dbl>
# 1 B      b          12
# 2 A      b          23
# 3 A      c          24
# 4 B      d          23

答案 1 :(得分:1)

在完成slicefilter之后,我们可以使用group_byarrange(与OP中的方法相同)

library(dplyr)
dt %>%
   group_by(Dealer) %>% 
   arrange(Dealer, desc(Freq)) %>%
   slice(1:2) 
   # or with 
   # filter(row_number() < 3)
# A tibble: 4 x 3
# Groups:   Dealer [2]
#  Dealer Product  Freq
#  <chr>  <chr>   <dbl>
#1 A      c          24
#2 A      b          23
#3 B      d          23
#4 B      b          12

注意:如果是平局,这将获得与slicefilter中指定的行数完全相同的输出