[R] Successive subsets from a vector?
Prof Brian Ripley
ripley at stats.ox.ac.uk
Tue Aug 22 12:13:48 CEST 2006
embed(VECTOR, 5)[, 5:1]
gives the subsets, so something like
apply(embed(VECTOR, 5)[, 5:1], 1, paste, collapse="")
does the job.
The following is a bit more efficient
ind <- 1:(length(VECTOR)-4)
do.call(paste, c(lapply(0:4, function(j) VECTOR[ind+j]), sep=""))
but by looking at how embed() works it could be made as efficient.
Larger example:
VECTOR <- sample(1:10, 1e5, replace=TRUE)
> system.time(apply(embed(VECTOR, 5)[, 5:1], 1, paste, collapse=""))
[1] 5.73 0.05 5.81 NA NA
> system.time({ind <- 1:(length(VECTOR)-4)
+ do.call(paste, c(lapply(0:4, function(j) VECTOR[ind+j]), sep=""))
+ })
[1] 1.00 0.01 1.01 NA NA
The loop method took 195 secs. Just assigning to an answer of the correct
length reduced this to 5 secs. e.g. use
ADDRESSES <- character(length(VECTOR)-4)
Moral: don't grow vectors repeatedly.
On Tue, 22 Aug 2006, kone wrote:
> I'd like to pick every imbricated five character long subsets from a
> vector. I guess there is some efficient way to do this without loops...
> Here is a for-loop-version and a model for output:
>
> VECTOR=c(1,4,2,6,5,0,11,10,4,3,6,8,6);
>
> ADDRESSES=c();
You do not need the semicolons, and they just confuse readers.
> for(i in 1:(length(VECTOR)-4)){
> ADDRESSES[i]=paste(VECTOR[i:(i+4)],collapse="")
> }
>
> > ADDRESSES
> [1] "14265" "42650" "265011" "6501110" "5011104" "0111043"
> "1110436" "104368"
> [9] "43686"
>
>
> Atte Tenkanen
> University of Turku, Finland
>
> [[alternative text/enriched version deleted]]
>
> ______________________________________________
> R-help at stat.math.ethz.ch mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>
--
Brian D. Ripley, ripley at stats.ox.ac.uk
Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/
University of Oxford, Tel: +44 1865 272861 (self)
1 South Parks Road, +44 1865 272866 (PA)
Oxford OX1 3TG, UK Fax: +44 1865 272595
More information about the R-help
mailing list