您可以使用帮助页面?sample上的示例:
resample <- function(x, ...) x[sample.int(length(x), ...)]
只需使用上面的resample 函数代替sample。如果您希望它的工作方式有所不同,或者对其进行重命名、修改等。
为了满足我自己的好奇心,我对到目前为止的建议做了一个快速基准测试:
library(microbenchmark)
mylist <- lapply( sample( rep( 1:10, 10 ) ), rpois, lambda=3 )
resample <- function(x, ...) x[sample.int(length(x), ...)]
sample1 <- function(x) x[sample.int(length(x), 1)]
ie1 <- function(x) if(length(x)==1) x else sample(x,1)
ie2 <- function(x) ifelse( length(x)==1, x, sample(x,1) )
rep1 <- function(x) { if( length(x) < 2 ) x <- rep(x,2); sample(x,1) }
(out <- microbenchmark(
sapply(mylist, resample, size=1),
sapply(mylist, sample1),
sapply(mylist, ie1),
sapply(mylist, ie2),
sapply(mylist, rep1)
))
有结果:
Unit: microseconds
expr min lq median uq max neval
sapply(mylist, resample, size = 1) 360.846 388.1455 398.4085 409.4925 2036.169 100
sapply(mylist, sample1) 339.499 365.7720 375.8300 391.6345 1846.100 100
sapply(mylist, ie1) 493.853 534.2900 543.3205 561.3840 2091.589 100
sapply(mylist, ie2) 1225.397 1291.6955 1328.4365 1395.1455 3787.850 100
sapply(mylist, rep1) 566.926 614.3405 627.2720 649.4405 2178.209 100