[R] sample consecutive integers efficiently

Chris Oldmeadow c.oldmeadow at student.qut.edu.au
Thu Aug 28 08:05:42 CEST 2008


Hi all,

I have some rough code to sample consecutive integers with length 
according to a vector of lengths

#sample space (representing positions)
pos<-c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20)

#sample lengths
lengths<-c(2,3,2)

 From these two vectors I need a vector of sampled positions.


the sampling is without replacement, making things tough as the sampled 
integers need to be consecutive. Im hoping somebody knows a faster way 
of doing it than I have. ATM its way to slow on large vectors.


samplePos<-function(l){
    start.pos<-sample(pos,1)
    end.pos<-start.pos+l-1
    posies<-start.pos:end.pos
    posies
}

s.start<-c()


newPos<-function(a){
    rp<-samplePos(a)
    #test sampled range is consecutive, if not resample
    if (length(rp) != rp[a]+1 -rp[1]){rp<-samplePos(a)}
    pos<-setdiff(pos,rp)
    rp[1]
}

newps<-c()
newps<-unlist(lapply(lengths,newPos))

I think the bottleneck may be on the setdiff() function - the sample 
space is quite large so I dont think there would be too many rejections.



Many thanks,
Chris



More information about the R-help mailing list