【问题标题】:Sampling from a subset of data从数据子集采样
【发布时间】: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 我已经发布了一个例子
  • 你能确保这是一个可重现的例子吗?

标签: r subset sub-array


【解决方案1】:

我认为你真正想要的是这样的东西

num.specs <- 3
haps[sample(seq(haps),size = num.specs,replace = F)]
[1] 3 5 4

那是你的向量的随机子集吗?

【讨论】:

    【解决方案2】:

    不是你想要的(返回矩阵列表而不是 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 个数字,然后转换为矩阵。

    【讨论】:

    • 几乎是我需要的。但我想以任意数字拆分(所以我用户不必每次都指定它)。有没有更简洁的方法来处理数组类型?
    • 如何将其拆分为 2 个以上的子数组?我没有看到任何表明这一点的论据。
    • 例如,您可以将中断指定为breaks=c(0, 2, 4, 5)。试一试。
    猜你喜欢
    • 2021-08-08
    • 2015-02-20
    • 1970-01-01
    • 2015-01-31
    • 2019-10-02
    • 2012-08-09
    • 1970-01-01
    • 2014-12-28
    • 2019-01-02
    相关资源
    最近更新 更多