2017-09-13 79 views
1

如果我有多个字符串,如:如何将字符串分解成重叠的集合的3

skhdsfiiuwkncyeuhrsl 
sdskkjheocbsill 
sldkjflsdkjb 

我怎么能输出程序是重叠的三胞胎,例如,我希望它输出:

skh, khd, hds, ..., rsl 
sds, dsk, skk, ..., ill 
sld, ldk, dkj, ..., kjb 
+1

你尝试过这么远吗?像'sapply(1:(nchar(x)-2),函数(i)substring(x,i,i + 2))'''也许? – Aramis7d

回答

2

this answer获得灵感,这里是一个班轮:

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" 
+1

@Frank谢谢,复制了错误的一行 - 我纠正了这些错误:) – cmaher

+0

这怎么可以用来制作四连音或5? –

4

substring作品:

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) 
) 

这给

[[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) 
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) 
相关问题