【发布时间】:2018-06-18 20:31:08
【问题描述】:
我有以下问题。
我有多个子数组(比如 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
希望这会有所帮助。
【问题讨论】:
-
样本一次只能处理一个对象。如果您想要更高级的采样,则必须构造一个函数。不想使用子集的原因是什么?如果子集是游戏,你可以做
sample(c(x[1:3], y[4:5]), ...)。 -
您能否提供一个数组示例和预期输出?
-
@RomanLuštrik 我有多个从 2 到 100 的子数组,因此以这种方式进行子集化会非常低效。
-
@missuse 我已经发布了一个例子
-
你能确保这是一个可重现的例子吗?