在我的数据框中(如下所示),我想提取销量排名前 5 的品牌。我想确保,如果我的品牌出现在前 5 名中,则会选择 5 个值,否则会选择我的品牌的前 5 行 + 行(总共 6 个值)。
dff4 <- data.frame(stringsAsFactors = FALSE, check.names = FALSE,
Region = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B",
"C", "C", "C", "C", "C"), Brand = c("B1", "B2", "B3",
"B4", "B5", "B6", "B7", "B8", "B9", "B10", "B11", "B12",
"B13", "B14", "B15"), Sales = c(2923, 2458, 2812, 2286,
1683, 1085, 2805, 3214, 1059, 1866, 3280, 2481, 2016, 1230, 1763))
然后我使用以下代码对销售数据进行排序:
dff4 <- dff4[order(-dff4$Sales), ]
现在我只需要在数据框中保留销售额排名前 5 的值。我可以使用以下几行来完成此操作。
dff4 <- head(dff4, 5)
但是,我还想确保我自己的品牌的数据保留在表中,无论它是否出现在前 5 名中。 例如,当我对上表进行排序时,我可以看到品牌“B4”没有出现在前 5 名中。如果我想确保我的代码仅在“B4”出现时选择前 5 名,否则选择前 5 名和品牌“B4”作为第 6 个值。
我该怎么做。
最佳答案
您可以使用slice_max()
选择Sales
值最高的5行,然后将Brand
B4绑定(bind)在后面。如果 B4 已位于前 5 行,distinct()
将删除重复的行。
library(dplyr)
dff4 %>%
slice_max(Sales, n = 5) %>%
bind_rows(filter(dff4, Brand == "B4")) %>%
distinct()
# Region Brand Sales
# 1 C B11 3280
# 2 B B8 3214
# 3 A B1 2923
# 4 A B3 2812
# 5 B B7 2805
# 6 A B4 2286
关于r - 选择前 5 行并保持某一行固定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73511424/