我需要在每个类别中选择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"
答案 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
这似乎是你所追求的。