我有一个带布尔值的输入向量vi
。我想从值为true的向量中随机抽取大小为n
的样本,因此最终向量vf
具有这些属性
矢量的长度相等
length(vf) == length(v0)
vf
有n
个真值
n==sum(vf)
vf
中的真实值不能超过v0
中的值
n< = sum(v0)
vf
中的所有真实值vi
向量表示数据框中的行选择,这实现了分层样本。到目前为止,我想出了如何使用which()
来获取行号,使用sample()
来获取随机样本,但最后一部分是重新创建布尔向量。可能有更优雅的方式?
例如:
n <- 1
v0 <- c(T,T,F,F)
vf <- c(T,F,F,F)
答案 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