1

If I have multiple strings like:

skhdsfiiuwkncyeuhrsl
sdskkjheocbsill
sldkjflsdkjb

How can I program the output to be the overlapping triplets, for example, I want it to output:

skh, khd, hds, ..., rsl
sds, dsk, skk, ..., ill
sld, ldk, dkj, ..., kjb
Keshav M
  • 1,239
  • 7
  • 19
  • 1
    what have you tried so far? something like `sapply(1:(nchar(x)-2), function(i) substring(x, i, i+2))` maybe? – Aramis7d Sep 13 '17 at 17:18

3 Answers3

4

substring works:

x = c("skhdsfiiuwkncyeuhrsl", "sdskkjheocbsill", "sldkjflsdkjb", "ab")
n = 3
lapply(x, function(z) 
  if ((nc <- nchar(z)) >= n) 
    substring(z, seq(1, nc - n + 1), seq(n, nc)) 
  else 
    character(0)
)

which gives

[[1]]
 [1] "skh" "khd" "hds" "dsf" "sfi" "fii" "iiu" "iuw" "uwk" "wkn" "knc" "ncy"
[13] "cye" "yeu" "euh" "uhr" "hrs" "rsl"

[[2]]
 [1] "sds" "dsk" "skk" "kkj" "kjh" "jhe" "heo" "eoc" "ocb" "cbs" "bsi" "sil"
[13] "ill"

[[3]]
 [1] "sld" "ldk" "dkj" "kjf" "jfl" "fls" "lsd" "sdk" "dkj" "kjb"

[[4]]
character(0)
Frank
  • 63,401
  • 8
  • 85
  • 161
2

Taking inspiration from this answer, Here's a one-liner:

strings <- c("skhdsfiiuwkncyeuhrsl",
"sdskkjheocbsill",
"sldkjflsdkjb")

sapply(strings, function(x) substring(x, seq(1,nchar(x)-2,1), seq(3,nchar(x),1)))

# $skhdsfiiuwkncyeuhrsl
#  [1] "skh" "khd" "hds" "dsf" "sfi" "fii" "iiu" "iuw" "uwk" "wkn" "knc" "ncy" "cye" "yeu" "euh"
# [16] "uhr" "hrs" "rsl"

# $sdskkjheocbsill
#  [1] "sds" "dsk" "skk" "kkj" "kjh" "jhe" "heo" "eoc" "ocb" "cbs" "bsi" "sil" "ill"

# $sldkjflsdkjb
#  [1] "sld" "ldk" "dkj" "kjf" "jfl" "fls" "lsd" "sdk" "dkj" "kjb"
cmaher
  • 4,454
  • 1
  • 18
  • 33
1
a <- "skhdsfiiuwkncyeuhrsl"
b <- "sdskkjheocbsill"
c <- "sldkjflsdkjb"

make_triplets <- 
  function(X){
    nTriplets <- length(2:(nchar(X)-1))
    triplets <- character(nTriplets)
    for(i in 2:(nchar(X)-1)){
      triplets[i-1] <- substr(X, i - 1, i + 1)
    }
    return(triplets)
  }
make_triplets(a)

make_triplets(b)

make_triplets(c)
jpshanno
  • 251
  • 2
  • 7