2015-12-16 2 views
2

Я хочу написать функцию, которая разделила бы строку на список триграмм, например.Разбирать строку до n-грамма без использования для цикла - R

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

Я могу написать это, используя для цикла,

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-оптимизированная версия, чтобы сделать это?

ответ

5

Вот версия с использованием 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" 
1

Вы можете попробовать с 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" 
Смежные вопросы