Re: [R] shifted window of string

From: David Winsemius <dwinsemius_at_comcast.net>
Date: Tue, 15 Jun 2010 01:19:23 -0400

On Jun 14, 2010, at 11:46 PM, david hilton shanabrook wrote:

> basically I need to create a sliding window in a string. a way to
> explain this is:
>
>> v <-
>> c
>> ("a
>> ","b
>> ","c
>> ","d
>> ","e
>> ","f
>> ","g
>> ","h
>> ","i
>> ","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y")
>> window <- 5
>> shift <- 2
>
> I want a matrix of characters with "window" columns filled with "v"
> by filling a row, then shifting over "shift" and continuing to the
> next row until "v" is exhausted. You can assume "v" will evenly fit
> "m"
>
> so the result needs to look like this matrix where each row is
> shifted 2 (in this case):
>
>> m
> [,1] [,2] [,3] [,4] [,5]
> [1,] "a" "b" "c" "d" "e"
> [2,] "c" "d" "e" "f" "g"
> [3,] "e" "f" "g" "h" "i"
> [4,] "g" "h" "i" "j" "k"
> [5,] "i" "j" "k" "l" "m"
> [6,] "k" "l" "m" "n" "o"
> [7,] "m" "n" "o" "p" "q"
> [8,] "o" "p" "q" "r" "s"
> [9,] "q" "r" "s" "t" "u"
> [10,] "s" "t" "u" "v" "w"
> [11,] "t" "u" "v" "w" "x"

I think you got the last row wrong:

 > m <- matrix(v[sapply(1:window, function(x) seq(x,

                                            (length(v)-window+x) ,
                                             by = shift))],
                  ncol=window)
 > m
       [,1] [,2] [,3] [,4] [,5]
  [1,] "a"  "b"  "c"  "d"  "e"
  [2,] "c"  "d"  "e"  "f"  "g"
  [3,] "e"  "f"  "g"  "h"  "i"
  [4,] "g"  "h"  "i"  "j"  "k"
  [5,] "i"  "j"  "k"  "l"  "m"
  [6,] "k"  "l"  "m"  "n"  "o"
  [7,] "m"  "n"  "o"  "p"  "q"

  [8,] "o" "p" "q" "r" "s"
  [9,] "q" "r" "s" "t" "u"
[10,] "s" "t" "u" "v" "w"
[11,] "u" "v" "w" "x" "y"
>
> This needs to be very efficient as my data is large, loops would be
> too slow. Any ideas? It could also be done in a string and then
> put into the matrix but I don't think this would be easier.

I'm not sure what you mean, but I think I might have done it the way you thought was harder. There might be a more efficient route with modulo arithmetic. Some elaboration of
 > v[((1:11)*4)%/%2 -1]
  [1] "a" "c" "e" "g" "i" "k" "m" "o" "q" "s" "u" But I don't see it immediately.

>
> I will want to put this in a function:
>
> shiftedMatrix <- function(v, window=5, shift=2){...
>
> return(m)}

Left as an exercise for the reader.


R-help_at_r-project.org 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. Received on Tue 15 Jun 2010 - 05:21:35 GMT

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.2.0, at Tue 15 Jun 2010 - 07:30:34 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-help. Please read the posting guide before posting to the list.

list of date sections of archive