当x具有不同的长度时使用sample()

时间:2013-08-29 16:43:12

标签: r

我有一个列表,其中不同的行具有不同的长度(有时长度为1)

我想使用

将样本应用于每一行

sapply(1:99,function(x) sample(mat[[]],1))

问题当然是每当行长度时,一个样本将从1:x中选择,而不是总是选择相同的数字。

有没有办法强制样本在长度为1时返回相同的值? 有什么方法可以避免这个问题?

3 个答案:

答案 0 :(得分:3)

由于1:x内容被硬编码到sample,因此最好的选择就是使用ifelse

sapply(mat[1:99], function(x) if(length(x)==1) x else sample(x, 1))

答案 1 :(得分:2)

您可以使用帮助页?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

答案 2 :(得分:0)

一旦你有matrixdataframe或其他任何理解,这是我用过的解决方法:

vec.len<-length(my_vector)
if (vec.len <2 ) my_vector<-rep(my_vector,2)
sample(my_vector,1)