我有一个列表,其中不同的行具有不同的长度(有时长度为1)
我想使用
将样本应用于每一行 sapply(1:99,function(x) sample(mat[[]],1))
问题当然是每当行长度时,一个样本将从1:x中选择,而不是总是选择相同的数字。
有没有办法强制样本在长度为1时返回相同的值? 有什么方法可以避免这个问题?
答案 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)
一旦你有matrix
与dataframe
或其他任何理解,这是我用过的解决方法:
vec.len<-length(my_vector)
if (vec.len <2 ) my_vector<-rep(my_vector,2)
sample(my_vector,1)