【发布时间】:2016-12-07 15:04:01
【问题描述】:
我正在 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() 根本没有高效,这是一个有趣的观察!
【讨论】:
microbenchmark(foo("stackoverflow", 4), foo1("stackoverflow", 4)))。无意批评,只是为了完整性而发布。对于长字符串,使用基本 R 方式更快,但使用 stringi::stri_sub 而不是 substring。
我们可以使用base R来做到这一点
substring(s,seq_len(nchar(s)-4+1),4:nchar(s))
数据
s <- "stackoverflow"
【讨论】: