2015-02-25 3 views
0

Код ниже отлично работает, чтобы удалить временные слова в myCharVector. Но когда myCharVector имеет большое количество предложений, для завершения требуется слишком много времени. Как ускорить работу цикла (используя приложение)?Как ускорить R-код

Спасибо.

library(tm) 

myCharVector <- c("This is the first sentence", "hello this is second", "and now is the third one") 
for(i in 1:length(myCharVector)) 
{ 
for(j in 1:length(stopwords("en"))) 
{ 
tmp1 <- paste(stopwords("en")[j], " ", sep = "") 
tmp1 <- paste(" ", tmp1, sep = "") 
myCharVector[i] <- gsub(tmp1, " ", myCharVector[i]) 
} 
} 
+0

Вы пробовали '' tm_map' и removeWords'? – ziyuang

+0

@Henrik Я попытался с помощью 'rm_stopwords (myCharVector, tm :: stopwords (" en "))', но это удаляет 'This' и' and', в то время как ожидаемый вывод на основе цикла имеет его. – akrun

+0

@akrun Спасибо, что указали это! – Henrik

ответ

3

Вы можете попробовать mgsub

library(qdap) 
mgsub(sprintf(' %s ', stopwords('en')), ' ', myCharVector) 
#[1] "This first sentence" "hello second"  "and now third one" 
+0

@Deb Рад узнать, что это сработало – akrun

3

кажется, что в этом случае есть domain-specific solution.

В целом, однако, старайтесь больше использовать векторные операции R. Например, вместо paste ИНГ каждое слово в отдельности, вы можете сделать это:

stopwords = paste0(' ', stopwords('en'), ' ') 

Это окружает каждый стопслов в свою очередь пробелами. В том же ключе вам не нужно зацикливаться на myCharVector, вы можете напрямую использовать gsub.

И самое главное, не перечеркивайте индексы. Это косвенное, медленное и (почти?) Всегда ненужное. Цикл по записям непосредственно вместо:

for (word in paste0(' ', stopwords('en'), ' ')) 
    myCharVector = gsub(word, ' ', myCharVector) 

Это в то же время гораздо короче, более четкой и эффективной, чем решения.

(Тем не менее, это даст неправильный результат в любом случае, вы должны действительно использовать предопределенную функцию.)

Смежные вопросы