布尔向量的随机样本

时间:2011-10-12 18:56:01

标签: r

我有一个带布尔值的输入向量vi。我想从值为true的向量中随机抽取大小为n的样本,因此最终向量vf具有这些属性

  1. 矢量的长度相等 length(vf) == length(v0)

  2. vfn个真值 n==sum(vf)

  3. vf中的真实值不能超过v0中的值 n< = sum(v0)

  4. vf中的所有真实值vi

  5. 向量表示数据框中的行选择,这实现了分层样本。到目前为止,我想出了如何使用which()来获取行号,使用sample()来获取随机样本,但最后一部分是重新创建布尔向量。可能有更优雅的方式?

    例如:

    n <- 1

    v0 <- c(T,T,F,F)

    vf <- c(T,F,F,F)

2 个答案:

答案 0 :(得分:4)

这是一个解决方案:

# Make up some vector v0 and choose n
v0 <- rep(c(F,T,F), 5)
n <- 3


# The actual code
x <- which(v0)
vf <- logical(length(v0))
vf[x[sample.int(length(x), n)]] <- TRUE


# Finally validate the result
identical(length(vf), length(v0)) # TRUE
all(v0[vf])  # TRUE
sum(vf) == n # TRUE

答案 1 :(得分:1)

您实质性地更改了要求。我的新建议通过随机选择正确数量的TRUE-indices设置为FALSE来工作:

vf <- vi; vf[sample( which(vi), size=sum(vi)-n)] <- FALSE

# Console
> vi <- sample(c(TRUE,FALSE),size=20, replace=TRUE, prob=c(0.9, 0.1) )
> vf <- vi; vf[sample( which(vi), size=sum(vi)-10)] <- FALSE
> sum(vf)
[1] 10