我想assign基于rank和创建limit列group。特别是,对于每个组,我都有一个优先级(例如,1、2、3 或 1、3、6 或 3、4、5 等)。根据排名(小数字优先),我想分配limit列中给出的资源。现在我正在手动执行此操作。但我想用tidyverse. 我如何通过mutateand group_by(或其他方法)分配?
1 回答
1
使用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))
于 2021-06-02T16:39:04.910 回答
