首页 > 解决方案 > 根据优先级分配资源

问题描述

我想assign基于rank和创建limitgroup。特别是,对于每个组,我都有一个优先级(例如,1、2、3 或 1、3、6 或 3、4、5 等)。根据排名(小数字优先),我想分配limit列中给出的资源。现在我正在手动执行此操作。但我想用tidyverse. 我如何通过mutateand group_by(或其他方法)分配?

在此处输入图像描述

标签: rtidyversedplyr

解决方案


使用tidyverse,您可以top_n在分组后使用。这将根据rank- 在每个组中保留的 n 由 决定过滤最高值limit。保留的将被分配 1,然后与您的原始数据合并。

让我知道这是否提供了预期的结果。

library(tidyverse)

df %>%
  group_by(group) %>%
  top_n(limit[1], desc(rank)) %>%
  mutate(assign = 1) %>%
  right_join(df) %>%
  replace_na(list(assign = 0)) %>%
  arrange(group, rank)

输出

   group  rank limit assign
   <chr> <dbl> <dbl>  <dbl>
 1 A         1     1      1
 2 A         2     1      0
 3 A         3     1      0
 4 B         1     1      1
 5 B         3     1      0
 6 B         6     1      0
 7 C         3     2      1
 8 C         4     2      1
 9 C         5     2      0
10 C         6     2      0

数据

df <- structure(list(group = c("A", "A", "A", "B", "B", "B", "C", "C", 
"C", "C"), rank = c(1, 2, 3, 1, 3, 6, 3, 4, 5, 6), limit = c(1, 
1, 1, 1, 1, 1, 2, 2, 2, 2)), class = "data.frame", row.names = c(NA, 
-10L))

推荐阅读