У меня есть список («вход»), и каждый элемент в списке представляет собой строку идентификаторов, которые представляют подгруппы большей популяции людей:
>head(input)
[[1]]
[1] "A" "C"
[[2]]
[1] "D" "E" "A"
[[3]]
[1] "A" "B" "J" "E"
[[4]]
[1] "B"
[[5]]
[1] "C" "F" "A"
[[6]]
[1] "H"
#the population
ids = c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J")
Для создания исходного набора данных я запустил короткий цикл:
input = list()
for (i in 1:1000) {
id.count = sample(1:4,1)
id.subgroup = sample(ids, id.count, replace = FALSE)
input[[i]] = id.subgroup
}
Я хочу случайным образом смоделировать новый набор данных, сохраняя неизменным следующее из исходного набора данных:
(a) количество появлений каждого идентификатора (в приведенном выше примере «A» отображается 4 раза, «H» один раз и т. Д.)
(b) распределение размеров подгрупп (в приведенном выше примере есть одна группа из 4, две группы из 3, одна группа из 2 и две группы из 1)
Пока что я бегу по исходному списку (входным данным), определяю длину каждого индекса и случайным образом выбираю столько идентификаторов из исходных данных. Я использую эти образцы для создания нового имитированного набора данных.
Однако я не хочу просто пробовать каждый элемент без замены; Я также не хочу повторять значения или идентификаторы в любой подгруппе. Приведенный ниже код не только заканчивается одним и тем же идентификатором несколько раз в подгруппе, но и не может поддерживать одинаковое количество появлений в наборе данных.
all.ids = unlist(input)
simulated = list()
for (i in 1:length(input)) {
temp.length = length(input[[i]])
temp.sample = sample(all.ids, temp.length, FALSE)
simulated[[i]] = temp.sample
}
Может быть, мне не следует использовать функцию 'sample', поскольку я действительно хочу сделать псевдослучайную выборку (нет двух одинаковых идентификаторов). Но также каждый раз, когда я делаю выборку из «all.ids», я хочу удалить этот идентификатор из «all.ids», чтобы общее количество появлений каждого идентификатора оставалось неизменным. По сути, я хочу случайным образом выбирать из оставшихся идентификаторов каждую итерацию в цикле, но убедившись, что в каждой подгруппе ни один идентификатор не появляется более одного раза.
Удачное решение проблемы выглядело бы так:
>head(simulated)
[[1]]
[1] "F" "A"
[[2]]
[1] "A" "E" "C"
[[3]]
[1] "D" "B" "H" "E"
[[4]]
[1] "A"
[[5]]
[1] "C" "A" "B"
[[6]]
[1] "J"