【问题标题】:Splitting a word into length combination将单词拆分为长度组合
【发布时间】:2016-12-07 15:04:01
【问题描述】:

我正在 R 中寻找一个函数,它可以给定一个整数,让我可以将一个单词拆分为该长度组合,但具有滚动效果。

例如function("stackoverflow", 4) 将呈现:

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

你们知道那个函数是否存在或者我必须创建它吗?

【问题讨论】:

    标签: r split tokenize


    【解决方案1】:
    ## 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() 根本没有高效,这是一个有趣的观察!

    【讨论】:

    • 不错的答案和 +1。实际上 rollapply 对于非常长的字符串更快,但对于“正常”长度的字符串,基本 R 版本要快得多(例如尝试microbenchmark(foo("stackoverflow", 4), foo1("stackoverflow", 4)))。无意批评,只是为了完整性而发布。对于长字符串,使用基本 R 方式更快,但使用 stringi::stri_sub 而不是 substring
    • 不错的方法谢谢。我不想使用 for 循环,所以你的更快
    【解决方案2】:

    我们可以使用base R来做到这一点

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

    数据

    s <- "stackoverflow"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-07
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多