【问题标题】:Assigning a random score based on max value of grouped data using R使用 R 根据分组数据的最大值分配随机分数
【发布时间】:2020-04-30 10:28:41
【问题描述】:

考虑一个示例数据框;

| 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() 根据行数轻松分配随机值,但是,有没有一种方法可以根据数据帧中每个组的最大和最小数量分配特定值。我一般会按 cat_name 分组。

【问题讨论】:

  • 最好包含您的评分规则,例如为什么 cat_name A 的 100 得到 30 以及为什么 500 得到 100
  • 我只是根据 amt 字段的值给出 0 到 100 之间的随机分数。例如,对于每个类别,我可以根据 amt 的最大值分配分数。金额越高,分数越高。

标签: r


【解决方案1】:

这是一种使用dplyrcat_namebrand_name 分组的方法。然后,它在该组的最小和最大 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

数据

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))

【讨论】:

  • 谢谢,已经够近了。但是,我想将最高分数分配给金额较高的分数。在这种情况下,对于 cat_name A,我会给它 100、80、30。我的分数范围在 100 到 0 之间。分数越高,分数越高,分数越低。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 2015-09-18
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
相关资源
最近更新 更多