R中的有条件样本

时间:2018-02-07 15:51:10

标签: r function combinations sample

我在另一篇文章中发现this function,在调用时依次输出向量组合。当存在大量具有许多元素的向量时,它本质上是expand.grid的工作。

这是功能:

lazyExpandGrid <- function(...) {
  dots <- list(...)
  argnames <- names(dots)
  if (is.null(argnames)) argnames <- paste0('Var', seq_along(dots))
  sizes <- lengths(dots)
  indices <- cumprod(c(1L, sizes))
  maxcount <- indices[ length(indices) ]
  i <- 0
  function(index) {
    i <<- if (missing(index)) (i + 1L) else index
    if (length(i) > 1L) return(do.call(rbind.data.frame, lapply(i, sys.function(0))))
    if (i > maxcount || i < 1L) return(FALSE)
    setNames(Map(`[[`, dots, (i - 1L) %% indices[-1L] %/% indices[-length(indices)] + 1L  ),
             argnames)
  }
} 

以下是一些示例调用:

set.seed(42)
nxt <- lazyExpandGrid(a=1:1e2, b=1:1e2, c=1:1e2, d=1:1e2, e=1:1e2, f=1:1e2)
as.data.frame(nxt()) # prints the 1st possible combination
nxt(sample(1e2^6, size=7)) # prints 7 sampled rows from the sample space

我无法弄清楚如何使用lazyExpandGrid2进行有条件的采样。如果样品有一定数量的元素,我想排除样品。

例如,假设我有这些向量,我想为其创建唯一的组合:a=0:3, b=0:4, c=0:5。我可以使用nxt(sample(50, size=50, replace = F))创建样本。

但是让我说我​​对有两个0的样本不感兴趣。我怎么能排除这些样品?我尝试过这样的事情:nxt(sample(which(!(sum(as.data.frame(nxt()) == 0)==2)), size=50, replace = F))

我只是不明白如何引用sample()中的采样行,以便在不符合某个条件时将其排除。

1 个答案:

答案 0 :(得分:1)

如果你想放弃那些不符合条件的行,我不认为你需要担心没有替换的采样,因为将相同的值传递给nxt会生成相同的行,仍将被删除。因此,如果您没有满足{&1;}生成的行,如果它不符合您的条件,则可以使用该功能的包装器,因为您已经在上面定义了该功能。 #39;重新开始。这里,如果零的数量等于2,则删除该行:

nxt