我有一个列表(“输入”),列表中的每个元素都是一串ID,代表一堆较大的个体的子组:
>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)每个ID的出现次数(在上面的示例中,“ A”显示4次,“ H”显示1次,等等)
(b)子组大小的分布(在上面的示例中,有一组4,两组3,一组2和一组1)
到目前为止,我浏览了原始列表(输入),标识了每个索引的长度,并从原始数据中随机抽取了许多ID。我使用这些样本来创建新的模拟数据集。
但是,我不只是想对每个元素进行采样而无需替换;我也不想在任何给定的子组中重复这些值或ID。下面的代码不仅在子组中多次以相同的ID结尾,而且也无法在数据集中保持相同的出现次数。
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
}
也许我不应该使用“采样”功能,因为我真正想做的是伪随机采样(没有两个ID相同)。而且,每次我从“ all.ids”采样时,我都想从“ all.ids”中删除该ID,以便每个ID的总外观保持不变。本质上,我想通过循环在每次迭代中从剩余的ID中随机抽样,但是要确保在每个子组中没有ID出现多次。
成功解决该问题的方法如下:
>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"