我有一个列表,其中不同的行具有不同的长度(有时长度为 1)
我想通过使用将样本应用于每一行
sapply(1:99,function(x) sample(mat[[]],1))
问题当然是,每当行的长度是一个样本将从 1:x 中选择,而不是总是选择相同的数字。
有没有办法强制样本在长度为 1 时返回相同的值?有什么替代方法可以避免这个问题?
我有一个列表,其中不同的行具有不同的长度(有时长度为 1)
我想通过使用将样本应用于每一行
sapply(1:99,function(x) sample(mat[[]],1))
问题当然是,每当行的长度是一个样本将从 1:x 中选择,而不是总是选择相同的数字。
有没有办法强制样本在长度为 1 时返回相同的值?有什么替代方法可以避免这个问题?
由于1:x
事情是硬编码sample
的,最好的选择就是使用ifelse
:
sapply(mat[1:99], function(x) if(length(x)==1) x else sample(x, 1))
您可以使用帮助页面上的示例?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
一旦你有了matrix
vs. dataframe
或任何它被理顺的东西,这是我使用的一种解决方法:
vec.len<-length(my_vector)
if (vec.len <2 ) my_vector<-rep(my_vector,2)
sample(my_vector,1)