3
我在R中寻找一个给定整数的函数,允许我将一个单词分割成长度组合,但是具有滚动效果。将一个单词分解成长度组合
例如function("stackoverflow", 4)
会使:
c("stac", "tack", "acko", "ckov", "kove", "over", "verf", "rflo", "flow")
你们是否知道,如果函数存在或者我必须创建它?
我在R中寻找一个给定整数的函数,允许我将一个单词分割成长度组合,但是具有滚动效果。将一个单词分解成长度组合
例如function("stackoverflow", 4)
会使:
c("stac", "tack", "acko", "ckov", "kove", "over", "verf", "rflo", "flow")
你们是否知道,如果函数存在或者我必须创建它?
## 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()
是而不是有效率,这是一个有趣的观察!
我们可以通过使用base R
substring(s,seq_len(nchar(s)-4+1),4:nchar(s))
数据
s <- "stackoverflow"
尼斯的答案和+1做到这一点。实际上,对于非常长的字符串,rollapply速度更快,但对于'正常'长度字符串,基本R版本更快(例如,尝试'microbenchmark(foo(“stackoverflow”,4),foo1(“stackoverflow”,4))')。不打算作为批评,只是张贴完整性。对于长字符串,使用基本R方法会更快,但使用'stringi :: stri_sub'而不是'substring'。 – konvas
好的方法谢谢你。我不想使用for循环,所以你的速度更快 – zemir