从数据子集中采样

时间:2018-01-09 18:18:02

标签: r subset sub-array

我有以下问题。

我有多个子阵列(比如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

希望这会有所帮助。

2 个答案:

答案 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))

使用cutsplit对字符标签矢量进行分区,然后再对其进行采样。在这里,我将您的角色标签分割为值2.此外,您可以将25个数字抽样一次,然后转换为矩阵,而不是将5个数字抽样5次。