相关疑难解决方法(0)

Tidyverse:过滤分组数据帧中的n个最大组

我想根据计数过滤n个最大的组,然后对过滤的数据帧进行一些计算

这是一些数据

Brand <- c("A","B","C","A","A","B","A","A","B","C")
Category <- c(1,2,1,1,2,1,2,1,2,1)
Clicks <- c(10,11,12,13,14,15,14,13,12,11)
df <- data.frame(Brand,Category,Clicks)

|Brand | Category| Clicks|
|:-----|--------:|------:|
|A     |        1|     10|
|B     |        2|     11|
|C     |        1|     12|
|A     |        1|     13|
|A     |        2|     14|
|B     |        1|     15|
|A     |        2|     14|
|A     |        1|     13|
|B     |        2|     12|
|C     |        1|     11|
Run Code Online (Sandbox Code Playgroud)

这是我的预期输出.我想按计数过滤掉两个最大的品牌,然后找出每个品牌/类别组合的平均点击次数

|Brand | Category| mean_clicks|
|:-----|--------:|-----------:|
|A     |        1|        12.0|
|A     |        2|        14.0|
|B     |        1|        15.0|
|B     |        2| …
Run Code Online (Sandbox Code Playgroud)

r top-n dplyr

10
推荐指数
1
解决办法
622
查看次数

dplyr - 按组大小过滤

过滤data.frame以获得大小为5的组的最佳方法是什么?

所以我的数据如下:

require(dplyr)
n <- 1e5
x <- rnorm(n)
# Category size ranging each from 1 to 5
cat <- rep(seq_len(n/3), sample(1:5, n/3, replace = TRUE))[1:n]

dat <- data.frame(x = x, cat = cat)
Run Code Online (Sandbox Code Playgroud)

我能想到的dplyr方式是

dat <- group_by(dat, cat)

system.time({
  out1 <- dat %>% filter(n() == 5L)
})
#    user  system elapsed 
#   1.157   0.218   1.497
Run Code Online (Sandbox Code Playgroud)

但这很慢...... dplyr有更好的方法吗?

到目前为止,我的解决方案解决方案如下:

system.time({
  all_ind <- rep(seq_len(n_groups(dat)), group_size(dat))
  take_only <- which(group_size(dat) == 5L)
  out2 <- dat[all_ind %in% take_only, ]
})
#    user  system elapsed …
Run Code Online (Sandbox Code Playgroud)

r subset filter dataframe dplyr

6
推荐指数
3
解决办法
2701
查看次数

标签 统计

dplyr ×2

r ×2

dataframe ×1

filter ×1

subset ×1

top-n ×1