【问题标题】:Random sample of boolean vector布尔向量的随机样本
【发布时间】:2011-12-06 09:37:19
【问题描述】:

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

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

  2. vf 具有 n 真实值 n==sum(vf)

  3. vf中的真实值不能大于v0中的真实值 n

  4. vf 中的所有真值在vi 中也为真

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

例如:

n <- 1

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

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

【问题讨论】:

  • 那么是length(vf) == length(v0)n <= sum(v0) 吗?
  • Tommy:是的,长度完全相等,vf 中的真值个数不能多,所以我会使用不替换的采样。
  • 您是否只是想从数据框中获取随机的行样本?我发现很难理解你想要做什么。如果您可以添加一个示例,将会有所帮助。
  • @Seth:它比随机样本要复杂一点:它更像是子集的随机样本。作为更多背景知识,这是我实施过采样的一个步骤,如“掌握数据挖掘”一书(第 197 页)中所述。向量v0 表示数据框中有负面响应的行,我需要减少负面响应,因为太多了。

标签: r


【解决方案1】:

这里有一个解决方案:

# 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

【讨论】:

    【解决方案2】:

    您对要求进行了实质性更改。我的新建议通过随机选择正确数量的 TRUE 指数来设置为 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
    

    【讨论】:

      猜你喜欢
      • 2015-12-29
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 2011-04-08
      • 2017-06-21
      • 2019-11-19
      • 1970-01-01
      相关资源
      最近更新 更多