使用运行长度编码(RLE)的随机采样

mdfafbf1  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(82)

是否可以在不更换的情况下进行采样?类似这样的东西(它不像预期的那样工作):

x <- rle(c(1,1,1,1,1,2,2))

result <- sample(x, size=2, replace=F)

print(inverse.rle(result))
# prints [1] 1 1 1 1 1 1 2 2
# a desired result [1] 1 1

字符串
换句话说,我希望有以下工作,但与运行长度编码:

set.seed(2)  
x <- c(1,1,1,1,1,2,2)

result <- sample(x, size=2, replace=F)

print(result)
# prints [1] 1 2

pbpqsu0x

pbpqsu0x1#

这里有一个函数来做这件事。你可能需要一些大的数字来证明这一点,而不仅仅是显式地扩展rle。

x <- rle(c(1,1,1,1,1,2,2))

sample_rle <- function(x, ...) {
  x$values[1+findInterval(
    sample(sum(x$lengths), ...),
    cumsum(x$lengths), 
    left.open=TRUE)]
}

sample_rle(x, size = 2, replace = FALSE)
#> [1] 2 1
sample_rle(x, size = 7, replace = FALSE)
#> [1] 2 1 2 1 1 1 1

字符串

rsaldnfx

rsaldnfx2#

实际上,如果使用S4Vectors函数Rle()而不是rle(),则采样可以开箱即用。

x <- Rle(c(1,1,1,1,1,2,2))
# numeric-Rle of length 7 with 2 runs
# Lengths: 5 2
# Values : 1 2
xs <- sample(x, 4, replace=F)
# numeric-Rle of length 4 with 2 runs
# Lengths: 2 2
# Values : 2 1
xs2 <- Rle(sort(xs))
# numeric-Rle of length 4 with 2 runs
# Lengths: 2 2
# Values : 1 2
as.vector(xs2)
# [1] 1 1 2 2

字符串

相关问题