【问题标题】:R, str_replace, gsub, how to replace a vector of characters for another vector of characters?R,str_replace,gsub,如何将一个字符向量替换为另一个字符向量?
【发布时间】:2019-11-21 15:47:45
【问题描述】:

我正在尝试从多行字符串中“删除”特定字符。

我能够从列中提取我想要“删除”的特定字符,但我无法将它们递归地替换为“”。

我尝试了mapvaluesgsubstr_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

【问题讨论】:

  • 你需要pat &lt;- paste0("[^", paste(permitted_seq_chars, collapse=""), "]") ; gsub(pat, "", test_col$sequence)

标签: r string character


【解决方案1】:

一个选项是将paste 单个字符作为用方括号括起来的模式字符串来逐字评估它(如果有元字符),然后在gsub 中替换为空白(""

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

【讨论】:

  • 这是一些我不知道的 gsub 语法!!。感谢那。在某些情况下,最好有一个无效字符目录。我想知道“从这个模式中什么都没有”而不是“排除所有东西,除了这个模式”的语法是什么。
猜你喜欢
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 2019-09-05
  • 2019-06-03
  • 2013-04-28
  • 1970-01-01
  • 2020-09-17
相关资源
最近更新 更多