0

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

我想通过使用将样本应用于每一行

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

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

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

4

3 回答 3

3

由于1:x事情是硬编码sample的,最好的选择就是使用ifelse

sapply(mat[1:99], function(x) if(length(x)==1) x else sample(x, 1))
于 2013-08-29T16:54:11.907 回答
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
于 2013-08-29T17:58:13.123 回答
0

一旦你有了matrixvs. dataframe或任何它被理顺的东西,这是我使用的一种解决方法:

vec.len<-length(my_vector)
if (vec.len <2 ) my_vector<-rep(my_vector,2)
sample(my_vector,1)
于 2013-08-29T16:52:45.600 回答