2

I know how to code for sequencing a sliding window of 3 with step 1 in a character vector, but would step 2 require a seq function?

So for step 1:

v <- c("ace", "king", "queen", "jack", "joker")

for(i in 1:3) {
    print(paste(v[i], v[i + 1], v[i + 2]))
}
## ace king queen
## king queen jack
## queen jack joker 

How would I modify this to have a step of 2 i.e. get output of:

## ace king queen
## queen jack joker 
AkselA
  • 8,153
  • 2
  • 21
  • 34
Monique
  • 43
  • 2
  • 9

2 Answers2

1

We can do this with shift from data.table with type='lead' and 'n' specified as vector of sequence from 0 to 2

library(data.table)
do.call(rbind, shift(vector, 0:2, type = "lead"))[,1:3]
#     [,1]    [,2]    [,3]   
#[1,] "ace"   "king"  "queen"
#[2,] "king"  "queen" "jack" 
#[3,] "queen" "jack"  "joker"

If we want the second sequence then use n = c(0, 2)

do.call(rbind, shift(vector, c(0, 2), type = "lead"))[, 1:3]
#     [,1]    [,2]   [,3]   
#[1,] "ace"   "king" "queen"
#[2,] "queen" "jack" "joker"

Or we can use rollapply from zoo

library(zoo)
rollapply(vector, 3, FUN = I)[c(TRUE, FALSE),]
#     [,1]    [,2]   [,3]   
#[1,] "ace"   "king" "queen"
#[2,] "queen" "jack" "joker"

Or using only base R

apply(embed(vector, 3), 1, rev)[c(TRUE, FALSE),]
#     [,1]    [,2]   [,3]   
#[1,] "ace"   "king" "queen"
#[2,] "queen" "jack" "joker"

data

vector <- c('ace', 'king', 'queen', 'jack', 'joker')
akrun
  • 874,273
  • 37
  • 540
  • 662
1

You can use the by argument in zoo's rollapply function.

v <- c("ace", "king", "queen", "jack", "joker")

library(zoo)
rollapply(v, width=3, paste, by=2)
#     [,1]    [,2]   [,3]   
#[1,] "ace"   "king" "queen"
#[2,] "queen" "jack" "joker"
AkselA
  • 8,153
  • 2
  • 21
  • 34