我需要创建一堆假数据集,其中两个变量的总和与我的实际数据相同,但每个变量的计数是随机的.这是设置:
>df
X.1 X.2
1 145 30
2 55 73
Run Code Online (Sandbox Code Playgroud)
第一行总和为175,第二行为128.我正在寻找的是一种生成数据帧(或一堆数据帧)的方法,如下所示:
>df.2
X.1 X.2
1 100 75
2 90 38
Run Code Online (Sandbox Code Playgroud)
在df.2中,单元格计数已更改,但行仍然汇总到同一个表.实际数据有数百行,但如果有帮助则只有两个变量.我试图找出如何做到这一点,sample()但没有运气.有什么建议?
谢谢!
也许你在寻找r2dtable?
> r2dtable(2, c(175,128), c(190, 113))
[[1]]
[,1] [,2]
[1,] 108 67
[2,] 82 46
[[2]]
[,1] [,2]
[1,] 114 61
[2,] 76 52
Run Code Online (Sandbox Code Playgroud)
此外,这是@ mnel的答案版本,用于rmultinom进行n复制,然后结合结果.并不是说如果你只需要一些重复就真的很重要,但既然rmultinom可以做到,我想我会看到它是如何完成的.
n <- 10
e <- cbind(X1 = c(100,90,30),X2 = c(75,28,120))
aperm(array(sapply(1:nrow(e), function(i)
rmultinom(n, rowSums(e)[i], (e/rowSums(e))[i,])),
dim=c(ncol(e),n,nrow(e))), c(3,1,2))
Run Code Online (Sandbox Code Playgroud)
您是从多项分布中抽样的,
允许预先指定的预期细胞计数
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)
Run Code Online (Sandbox Code Playgroud)
这将创建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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
263 次 |
| 最近记录: |