2013-11-29 3 views
3

Просто чтобы помочь кому-то, кто только добровольно удалил свой вопрос, выполнив запрос кода, который он попробовал, и другие комментарии. Предположим, они попробовали что-то вроде этого:Удаление повторяющихся слов в строке в R

str <- "How do I best try and try and try and find a way to to improve this code?" 
d <- unlist(strsplit(str, split=" ")) 
paste(d[-which(duplicated(d))], collapse = ' ') 

и хотел узнать лучший способ. Итак, что является лучшим способом удалить дублирующее слово из строки?

+0

Это кажется хорошим решением, хотя вы можете 'gsub' из пунктуации, в противном случае, например, "код?" в примере предложение не будет отмечен дубликат более раннего автономного «кода». – Thomas

ответ

2

Если вас интересуют альтернативные решения, вы можете использовать unique, что немного упрощает ваш код.

paste(unique(d), collapse = ' ') 

Согласно комментарию Томаса, вы, вероятно, хотите удалить знаки препинания. R's gsub имеет несколько хороших внутренних шаблонов, которые вы можете использовать вместо строгих регулярных выражений. Конечно, вы всегда можете указать конкретные экземпляры, если хотите сделать еще более утонченное регулярное выражение.

d <- gsub("[[:punct:]]", "", d) 
1

Я не уверен, что случай струны является проблемой. Это решение использует qdap с qdapRegex пакет дополнительными, чтобы убедиться, что знаки препинания и начало строки случай не мешает удалению, но поддерживается:

str <- c("How do I best try and try and try and find a way to to improve this code?", 
    "And and here's a second one one and not a third One.") 

library(qdap) 
library(dplyr) # so that pipe function (%>% can work) 

str %>% 
    tolower() %>% 
    word_split() %>% 
    sapply(., function(x) unbag(unique(x))) %>% 
    rm_white_endmark() %>% 
    rm_default(pattern="(^[a-z]{1})", replacement = "\\U\\1") %>% 
    unname() 

## [1] "How do i best try and find a way to improve this code?" 
## [2] "And here's a second one not third." 
+0

Что такое функция word_split() при попытке запустить этот код, она запустила ошибку в word_split(). –

+0

Вы установили пакет ** qdap **? –

+0

! Ahh. Я понял. Я не заметил, что у меня есть проблема с пакетом rJava, который является своего рода зависимостью от qdap. Спасибо @Rinker. –

1

Там нет необходимости дополнительный пакет

str <- c("How do I best try and try and try and find a way to to improve this code?", 
     "And and here's a second one one and not a third One.") 

Atomic функция:

rem_dup.one <- function(x){ 
    paste(unique(tolower(trimws(unlist(strsplit(x,split="(?!')[ [:punct:]]",fixed=F,perl=T))))),collapse = " ") 
} 
rem_dup.one("And and here's a second one one and not a third One.") 

Vectorize

rem_dup.vector <- Vectorize(rem_dup.one,USE.NAMES = F) 
rem_dup.vector(str) 

РЕЗУЛЬТАТ

"how do i best try and find a way to improve this code" "and here's a second one not third" 
Смежные вопросы