Назначение случайной оценки на основе максимального значения сгруппированных данных с использованием R - PullRequest
1 голос
/ 30 апреля 2020

Рассмотрим примерный фрейм данных;

| 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 в качестве балла, а затем для каждой группы в наборе данных на основе значения max и min я назначу оценка.

Я могу легко назначить случайное значение, основанное на количестве строк, используя sample.int (), но есть ли способ, которым я могу назначить определенное значение c, основанное на максимуме и минимальное количество каждой группы в кадре данных. Я буду, как правило, группировать по cat_name.

1 Ответ

1 голос
/ 30 апреля 2020

Вот подход с dplyr для группировки по cat_name и brand_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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...