在这里,我有三个字段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”包进行类似操作。
答案 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)
在完成slice
和filter
之后,我们可以使用group_by
或arrange
(与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
注意:如果是平局,这将获得与slice
或filter
中指定的行数完全相同的输出