我有以下问题。
我有多个子阵列(比如2),我已经填充了字符标签(1,2,3,4,5)。我的算法根据出现概率随机选择标签。
如何让R代替为子阵列1选择标签1:3,为子阵列2选择4:5,比如说,不使用子集(即[])。也就是说,我希望为每个子阵列选择一个随机的标签子集,而不是使用[]手动分配给每个子阵列的所有标签。
我知道sample()应该有帮助。
使用子集(我不想要),可以做
x <- 1:5
sample(x[1:3], size, prob = probs[1:3])
但是这会将标签1:3分配给所有子阵列。
将
sample(sample(x), size, replace = TRUE, prob = probs)
工作?
有什么想法吗?如果不清楚,请告诉我。
这是一个小例子,它为10个子阵列中的每一个选择1:5的标签。
set.seed(1)
N <- 10
K <- 2
Hstar <- 5
probs <- rep(1/Hstar, Hstar)
perms <- 5
## Set up container(s) to hold the identity of each individual from each permutation ##
num.specs <- ceiling(N / K)
## Create an ID for each haplotype ##
haps <- 1:Hstar
## Assign individuals (N) to each subpopulation (K) ##
specs <- 1:num.specs
## Generate permutations, assume each permutation has N individuals, and sample those individuals' haplotypes from the probabilities ##
gen.perms <- function() {
sample(haps, size = num.specs, replace = TRUE, prob = probs) # I would like each subarray to contain a random subset of 1:5.
}
pop <- array(dim = c(perms, num.specs, K))
for (i in 1:K) {
pop[,, i] <- replicate(perms, gen.perms())
}
pop
希望这会有所帮助。
答案 0 :(得分:0)
我认为你真正想要的是那样的
num.specs <- 3
haps[sample(seq(haps),size = num.specs,replace = F)]
[1] 3 5 4
这是你的矢量世界的随机子集?
答案 1 :(得分:0)
不是你想要的(返回矩阵列表而不是3D数组),但这可能会有所帮助
lapply(split(1:5, cut(1:5, breaks=c(0, 2, 5))), function(i) matrix(sample(i, 25, replace=TRUE), ncol=5))
使用cut
和split
对字符标签矢量进行分区,然后再对其进行采样。在这里,我将您的角色标签分割为值2.此外,您可以将25个数字抽样一次,然后转换为矩阵,而不是将5个数字抽样5次。