将一个单词拆分成长度组合

3
我正在寻找一种在R语言中的函数,该函数可以将给定长度的整数用滚动效果拆分单词。例如,function("stackoverflow", 4) 将呈现如下结果:
c("stac", "tack", "acko", "ckov", "kove", "over", "verf", "rflo", "flow")

你们知不知道是否存在那个函数或者我必须自己创建它?
2个回答

5
## install.packages("zoo")

x <- unlist(strsplit("stackoverflow",""))
zoo::rollapply(x,width=4,FUN = paste0,collapse="")
# [1] "stac" "tack" "acko" "ckov" "kove" "over" "verf" "erfl" "rflo" "flow"

一个函数?
foo <- function(input, h) {
  x <- unlist(strsplit(input,""))
  zoo::rollapply(x,width=h,FUN = paste0,collapse="")
  }

foo("stackoverflow", 4)
# [1] "stac" "tack" "acko" "ckov" "kove" "over" "verf" "erfl" "rflo" "flow"

一个基准测试

考虑使用 substring() 的基本R语言方法:

foo1 <- function(input, h) substring(input, seq_len(nchar(input)-h+1),h:nchar(input))

让我们生成一个非常长的玩具字符字符串:

x <- paste0(rep("a",100000), collapse="")

system.time(foo(x,4))
#   user  system elapsed 
#  2.280   0.004   2.288 

system.time(foo1(x,4))
#   user  system elapsed 
# 10.492   0.000  10.509 

因此,看似向量化的函数substring()实际上并不高效,这是一个有趣的观察结果!

好答案,加一分。确实,对于非常长的字符串,rollapply更快,但对于“正常”长度的字符串,基本的R版本要快得多(例如尝试microbenchmark(foo("stackoverflow", 4), foo1("stackoverflow", 4)))。这并不是批评,只是为了完整性而发布。对于长字符串,使用基本的R方式,但使用stringi::stri_sub代替substring会更快。 - konvas
很好的解决方法,谢谢。我不想使用for循环,所以你的方法更快。 - zemir

4

我们可以使用基础R来完成这项任务。

substring(s,seq_len(nchar(s)-4+1),4:nchar(s))

数据

s <- "stackoverflow"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接