【问题标题】:Parse string to n-gram without using for loop - R在不使用 for 循环的情况下将字符串解析为 n-gram - R
【发布时间】:2015-12-16 15:09:06
【问题描述】:

我想编写一个函数,将字符串分成三元组,例如

"JOHNSTEWART" --> chr [1:9] "JOH" "OHN" "HNS" "NST" "STE" "TEW" "EWA" "WAR" "ART"

我可以用 for 循环来写这个,

ngram_function <- function(x){
  if(!is.na(x)&(nchar(x)>2)){
    ngram <- rep("n", n= nchar(x)-3+1)
    for (i in c(1:nchar(x)-2)){
      ngram[i] <-(substr(x, start =i,stop= i-1+3))
    }
    return(ngram)
  }
  else{
     return(x)
  }
}

但是针对大量值进行扩展需要很长时间,是否有任何其他 R 优化版本可以做到这一点?

【问题讨论】:

    标签: r parsing for-loop lapply


    【解决方案1】:

    这是使用sapply的版本:

    myfun <- function(x, n){
      sapply(1:(nchar(x)-n+1), function(z) substr(x, z, z+n-1))
    }
    
    myfun("JOHNSTEWART", 3)
    [1] "JOH" "OHN" "HNS" "NST" "STE" "TEW" "EWA" "WAR" "ART"
    myfun("JOHNSTEWART", 4)
    [1] "JOHN" "OHNS" "HNST" "NSTE" "STEW" "TEWA" "EWAR" "WART"
    

    【讨论】:

      【解决方案2】:

      你可以试试substr和mapply:

      string <- "JOHNSTEWART"
      nc <- nchar(string)
      
      mapply(function(x, y){substr(string, x, y)}, x=1:(nc-2), y=3:nc)
      # [1] "JOH" "OHN" "HNS" "NST" "STE" "TEW" "EWA" "WAR" "ART"
      

      【讨论】:

        猜你喜欢
        • 2018-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-09
        • 1970-01-01
        • 2022-09-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多