2016-08-02 38 views
3

我在R中寻找一个给定整数的函数,允许我将一个单词分割成长度组合,但是具有滚动效果。将一个单词分解成长度组合

例如function("stackoverflow", 4)会使:

c("stac", "tack", "acko", "ckov", "kove", "over", "verf", "rflo", "flow") 

你们是否知道,如果函数存在或者我必须创建它?

回答

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()而不是有效率,这是一个有趣的观察!

+0

尼斯的答案和+1做到这一点。实际上,对于非常长的字符串,rollapply速度更快,但对于'正常'长度字符串,基本R版本更快(例如,尝试'microbenchmark(foo(“stackoverflow”,4),foo1(“stackoverflow”,4))')。不打算作为批评,只是张贴完整性。对于长字符串,使用基本R方法会更快,但使用'stringi :: stri_sub'而不是'substring'。 – konvas

+0

好的方法谢谢你。我不想使用for循环,所以你的速度更快 – zemir

4

我们可以通过使用base R

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

数据

s <- "stackoverflow" 
相关问题