我有一个有趣的(仅限我,也许,:))问题.我有这样的文字:
"abbba"
Run Code Online (Sandbox Code Playgroud)
问题是在此字符串中查找长度为n的所有可能的子字符串.例如,如果n = 2,子串是
'ab','bb','ba'
Run Code Online (Sandbox Code Playgroud)
如果n = 3,子串是
'abb','bbb','bba'
Run Code Online (Sandbox Code Playgroud)
我想用这样的东西:
x <- 'abbba'
m <- matrix(strsplit(x, '')[[1]], nrow=2)
apply(m, 2, paste, collapse='')
Run Code Online (Sandbox Code Playgroud)
但我得到了一个警告,它对len = 3不起作用.
Jul*_*ora 10
我们可以使用
x <- "abbba"
allsubstr <- function(x, n) unique(substring(x, 1:(nchar(x) - n + 1), n:nchar(x)))
allsubstr(x, 2)
# [1] "ab" "bb" "ba"
allsubstr(x, 3)
# [1] "abb" "bbb" "bba"
Run Code Online (Sandbox Code Playgroud)
其中substring从x指定位置开始和结束提取子字符串.我们利用substring矢量化的事实并1:(nchar(x) - n + 1)作为起始位置和n:nchar(x)结束位置传递.
向量的所有combn组合将按列排列。事先分割向量并转置结果将得到矩阵形式的结果。然后可以将其与do.call(paste,...)矩阵组合作为数据框:
mat <- unique(t(combn(strsplit(x, "")[[1]],2)))
do.call(paste0, as.data.frame(mat))
#[1] "ab" "aa" "bb" "ba"
Run Code Online (Sandbox Code Playgroud)
更新
combn我们还可以使用更短的语法指定处理组合的方式(@docendo):
unique(combn(strsplit(x, "")[[1]],3, FUN=paste, collapse=""))
Run Code Online (Sandbox Code Playgroud)
编辑
仅当您正在寻找所有组合时才使用此解决方案。如果您只是寻求滚动分割,请使用朱利叶斯的答案。