Произвольно выбрать номер (без повторения) для каждой группы в R - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть следующий фрейм данных, содержащий переменную «группа» и переменную «количество элементов в группе»

group    elements
1        3
2        1
3        14
4        10
..       ..
..       ..
30       5

, тогда у меня есть набор чисел, идущих от 1 до (скажем) 30

при суммировании «элементов» я получу 900. Я хочу получить случайный выбор числа (от 0 до 30) от 1 до 30 и присвоить его каждой группе, пока я не заполню количество элементов для эта группа. Каждый из них должен появляться в общей сложности 30 раз.

, таким образом, для группы 1 я хочу случайным образом выбрать 3 числа от 0 до 30 для группы 2, 1 число от 0 до 30 et c. пока я не заполню все группы.

итоговая таблица должна выглядеть так:

group     number(randomly selected)
1           7
1           20
1           7
2           4
3           21
3           20
...

есть предложения о том, как мне этого добиться?

Ответы [ 4 ]

3 голосов
/ 17 февраля 2020

В базе R, если у вас есть df, как это ...

df
  group elements
     1        3
     2        1
     3       14

Тогда вы можете сделать это ...

data.frame(group = rep(df$group,                     #repeat group no...
                       df$elements),                 #elements times
           number = unlist(sapply(df$elements,       #for each elements...
                                  sample.int,        #...sample <elements> numbers
                                  n=30,              #from 1 to 30
                                  replace = FALSE))) #without duplicates

   group number
1      1     19
2      1     15
3      1     28
4      2     15
5      3     20
6      3     18
7      3     27
8      3     10
9      3     23
10     3     12
11     3     25
12     3     11
13     3     14
14     3     13
15     3     16
16     3     26
17     3     22
18     3      7
0 голосов
/ 17 февраля 2020

Я решил следующим образом:

random_sample <- rep(1:30, each=30)
random_sample <- sample(random_sample)

, затем я создаю df с этой переменной и переменной, содержащей одну группу на строку, повторяемую числом элементов в самой группе

0 голосов
/ 17 февраля 2020

Вам нужно сгенерировать новый фрейм данных, повторяющий время элемента $ group $, а затем, используя пример, вы можете сгенерировать точное число случайных чисел:

data<-data.frame(group=c(1,2,3,4,5),
                 elements=c(2,5,2,1,3))

data.elements<-data.frame(group=rep(data$group,data$elements),
                          number=sample(1:30,sum(data$elements)))

Результат:

group number
1      1      9
2      1      4
3      2     29
4      2     28
5      2     18
6      2      7
7      2     25
8      3     17
9      3     22
10     4      5
11     5      3
12     5      8
13     5     26
0 голосов
/ 17 февраля 2020

Попробуйте:

df <- read.table(text = "group    elements
1        3
2        1
3        14
4        10
30       5", header = TRUE)

# reproducibility
set.seed(1)
df_split2 <- do.call("rbind", 
                     (lapply(split(df, df$group),
                             function(m) cbind(m, 
                                               `number(randomly selected)` = 
                                                 sample(1:30, replace = TRUE, 
                                                        size = m$elements),
                                               row.names = NULL
                                        ))))

# remove element column name
df_split2$elements <- NULL
head(df_split2)
#>     group number(randomly selected)
#> 1.1     1                        25
#> 1.2     1                         4
#> 1.3     1                         7
#> 2       2                         1
#> 3.1     3                         2
#> 3.2     3                        29

Функция split разбивает df на куски на основе столбца group. Затем мы берем эти меньшие фреймы данных и добавляем к ним столбец путем выборки 1:30 всего elements времени. Затем мы do.call в этом списке вернемся к rbind.

...