R, str_replace, gsub, как заменить вектор символов на другой вектор символов? - PullRequest
2 голосов
/ 12 июля 2019

Я пытаюсь «удалить» определенные символы из строк в нескольких строках.

Мне удалось извлечь определенные символы, которые я хочу «удалить» из столбца, но я не могузамените их рекурсивно на "".

Я пробовал некоторые варианты с mapvalues, gsub и str_replace, но мне не повезло

#Example data   
test_col<-data.frame(sequence=c("ATGCRYSW\n",
                                   "ATGCRYSW\\n",
                                   "ATGCRYSW\r\n",
                                   "ATGCRYSW\r\nATGCRYSW",
                                   "ATGCRYSW"),
                                   stringsAsFactors = FALSE)


#vector of allowed characters in strings
permitted_seq_chars<-c("A","C","G","T","R","Y","S","W","K",
                       "M","B","D","H","V","N","+","-","X")



#get all the unique characters in column of interest
all_unique_source_seq_chars<-unique(unlist(strsplit(test_col[["sequence"]],
                                     split ="")))


#subset invalid characters
all_unique_source_seq_invalid_chars<-setdiff(all_unique_source_seq_chars,
                                             permitted_seq_chars )

#'delete' invalid characters one by one. So far the only way I've been able to 
# do so, but i would like to not depend on fixed variables if new ones arise  
# in the future

str_replace_all(test_col$sequence, c( "\n"= "",
                                       "\\"="",
                                       "n"=""))

естьЛюбой способ сделать это рекурсивно, просто глядя на all_unique_source_seq_invalid_chars?

1 Ответ

2 голосов
/ 12 июля 2019

Можно указать paste отдельные символы в виде строки шаблона, заключенной в квадратные скобки, чтобы оценить ее буквально (в случае наличия метасимволов), а затем заменить на пробел ("") в gsub* 1004.*

pat <- paste0("[^", gsub("\\s{2,}", " ", paste(permitted_seq_chars, collapse="")), "]")
gsub(pat, "", test_col$sequence)
#[1] "ATGCRYSW"         "ATGCRYSW"         "ATGCRYSW"    
#[4] "ATGCRYSWATGCRYSW" "ATGCRYSW" 
...