r - 选择前 5 行并保持某一行固定

标签 r dataframe dplyr tidyverse

在我的数据框中(如下所示),我想提取销量排名前 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行,然后将BrandB4绑定(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/

相关文章:

RcppRoll 或 CumSum 滞后于动态窗口

r - 将变量或表达式传递给 `aes`

将列表对象中的 NaN/Inf/NA 替换为 0

r - r中的NROW和nrow有什么区别?

r - 如何使用 tidyverse 根据日期/时间时间戳列删除重复记录?右

python - 提取数组中的连续行

python - 如何根据其他列的条件在数据框中创建新列?

python - Pandas Groupby 返回最大值和其他特定列

使用 tidyverse 重新定位行

r - 类别数不等于特定类别数