使用R根据分组数据的最大值分配随机分数
考虑一个示例数据帧使用R根据分组数据的最大值分配随机分数,r,R,考虑一个示例数据帧 | cat_name | brand_name | qty | amt | ------------------------------------- | A | AA | 10 | 500 | | A | AB | 8 | 400 | | A | AC | 10 | 100 | | B | BA | 20 | 250 | | B
| cat_name | brand_name | qty | amt |
-------------------------------------
| A | AA | 10 | 500 |
| A | AB | 8 | 400 |
| A | AC | 10 | 100 |
| B | BA | 20 | 250 |
| B | BB | 05 | 150 |
| B | BC | 10 | 100 |
我想根据数据框中每个组的金额最大值分配分数,例如,对于上述数据集,我可以提供以下示例分数
| cat_name | brand_name | qty | amt | score |
----------------------------------------------
| A | AA | 10 | 500 | 100 |
| A | AB | 8 | 400 | 80 |
| A | AC | 10 | 100 | 30 |
| B | BA | 20 | 250 | 100 |
| B | BB | 05 | 150 | 75 |
| B | BC | 10 | 100 | 30 |
如前所述,我将根据0-100分配一个值作为分数,然后根据最大值和最小值为数据集中的每个组分配一个分数
我可以使用sample.int()根据行数轻松地分配一个随机值,但是,有没有一种方法可以根据数据帧中每个组的最大和最小数量分配一个特定值。我通常会按猫名进行分组。这里有一种方法,使用
dplyr
按猫名
和品牌名
进行分组。然后对该组的最小值和最大值amt
进行采样,并使用mutate
将其分配给一个新列
library(dplyr)
data %>%
group_by(cat_name,brand_name) %>%
mutate(score = sample(seq(min(amt),max(amt)),n(),replace = TRUE))
## A tibble: 6 x 5
## Groups: cat_name, brand_name [6]
# cat_name brand_name qty amt score
# <fct> <fct> <int> <int> <int>
#1 A AA 10 500 466
#2 A AB 8 400 167
#3 A AC 10 100 12
#4 B BA 20 250 54
#5 B BB 5 150 73
#6 B BC 10 100 85
库(dplyr)
数据%>%
分组依据(类别名称、品牌名称)%>%
变异(分数=样本(序号(最小(金额)、最大(金额)),n(),替换=真)
##一个tibble:6x5
##分组:类别名称、品牌名称[6]
#类别名称品牌名称数量金额分数
#
#1 A AA 10 500 466
#2 AB 8 400 167
#3 A AC 10 100 12
#4 B BA 20 250 54
#5B BB515073
#公元前6年1010085
数据
data <- structure(list(cat_name = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("A",
"B"), class = "factor"), brand_name = structure(1:6, .Label = c("AA",
"AB", "AC", "BA", "BB", "BC"), class = "factor"), qty = c(10L,
8L, 10L, 20L, 5L, 10L), amt = c(500L, 400L, 100L, 250L, 150L,
100L)), class = "data.frame", row.names = c(NA, -6L))
数据最好包括你的评分规则,比如为什么猫名A得100分,为什么500分,为什么100分。我只是根据金额字段的值,随机给0到100分。例如,对于每个类别,我可以根据金额的最大值分配分数。金额越高,分数越高。谢谢,已经足够接近了。但是,我想把最高分数分配给金额较高的那个。在这种情况下,对于猫的名字A,我会给它100,80,30。我的分数范围在100到0之间。金额越高,分数值越高,金额越低,分数越低。