R:选择成组的顶级产品

时间:2017-08-23 12:16:45

标签: r

我需要在每个类别中选择3个畅销产品,但如果类别没有3个产品,我应该添加更多来自最佳类别的产品(" a"是最好的类别," c"最差)。

每天产品都会发生变化,所以我想自动更新。以前我确实选择了前3名产品,如果没有,我没有打扰,但不幸的是条件发生了变化。为此,我使用了如下代码:

Selected <- items %>% group_by(Cat) %>%  dplyr:: filter(row_number() < 3) %>% ungroup 

示例数据:

items <- data.frame(Cat = c("a", "a", "a", "b", "b", "c", "c", "c", "c", "c", "c", "c", "c", "c", "c"),
                    ranking = 1:15)

期望的结果:

"a", "a", "a", "b", "b", "c", "c", "c", "c"

样本数据 - 2:

items <- data.frame(Cat = c("a", "a", "a", "a", "b", "c", "c", "c", "c", "c", "c", "c", "c", "c", "c"),
                    ranking = 1:15)

期望的结果 - 2:

"a", "a", "a", "a", "b", "c", "c", "c", "c"

1 个答案:

答案 0 :(得分:1)

这是一个可能的答案。我不完全确定我是否能得到你想要的东西 - 如果不是让我知道的话。

items <- data.frame(Cat = c("a", "a", "a", 
                            "b", "b", 
                            "c", "c", "c", "c", "c", "c", "c", "c", "c", "c"),
                    ranking = 1:15) 

首先,我们根据最佳类别对数据进行排序,并在类别中添加计数。

Selected <- items %>% group_by(Cat) %>%  
                      mutate(id = row_number()) %>% 
                      ungroup() %>% arrange(Cat)

然后我们可以制作过滤器并填充从最佳到最差的剩余行

Selected %>% filter(id<=3) %>%   # Select top 3 in each group
             bind_rows(Selected %>% filter(id>3)) %>% # Merge with the ones that weren't selected
             mutate(id=row_number()) %>% 
             filter(id <= 3*length(unique(Cat))) # Extract the right number

这会产生

# A tibble: 9 x 3
     Cat ranking    id
  <fctr>   <int> <int>
1      a       1     1
2      a       2     2
3      a       3     3
4      b       4     4
5      b       5     5
6      c       6     6
7      c       7     7
8      c       8     8
9      c       9     9

第二个数据示例产生

# A tibble: 9 x 3
     Cat ranking    id
  <fctr>   <int> <int>
1      a       1     1
2      a       2     2
3      a       3     3
4      b       5     4
5      c       6     5
6      c       7     6
7      c       8     7
8      a       4     8
9      c       9     9

这似乎是你所追求的。