我处于一种情况,需要创建一堆假数据集,其中两个变量的总和与我的真实数据相同,但是每个变量的计数都是随机的。设置如下:
>df
X.1 X.2
1 145 30
2 55 73
第一行总计为175,第二行总计为128。我正在寻找的是一种生成数据帧(或一堆数据帧)的方法,如下所示:
>df.2
X.1 X.2
1 100 75
2 90 38
在df.2中,单元格计数已更改,但行仍累加到同一张表中。实际数据有几百行,但是如果有帮助的话,只有两个变量。我试图弄清楚如何用
sample()
做到这一点,但是还没有运气。有什么建议么?谢谢!
最佳答案
您是从多项分布中采样的,
编辑
允许预先指定的预期细胞数
编辑2
expected
传递为预期的单元格计数请注意,
rmultinom
返回一个矩阵,其中每一列都是一个多项式样本,因此我使用t
创建一个单行矩阵replicates <- 10
expected <- data.frame(X1 = c(100,90,30),X2 = c(75,28,120))
## X1 X2
## 1 100 75
## 2 90 28
## 3 30 120
data_samples <- lapply(seq(replicates), function(i, expected){
# create a list of expected cell counts (list element = row of expected)
.list <- lapply(apply(expected,1,list),unlist)
# sample from these expected cell counts and recombine into a data.frame
as.data.frame(do.call(rbind,lapply(.list, function(.x) t(rmultinom(n = 1, prob = .x, size = sum(.x) )))))
}, expected = expected)
这将创建具有适当属性的
data.frames
列表data_samples[[1]]
## X1 X2
## 1 104 71
## 2 84 34
## 3 19 131
data_samples[[5]]
## X1 X2
## 1 88 87
## 2 92 26
## 3 27 123
关于r - 生成数据,其中单元格计数是随机的,但行总和始终相同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12031049/