根据旧的和更正的列表在文件中查找和替换 codes/words 组

Finding and substituting set of codes/words in a file based on a list of old and corrected ones

我有一个 FASTA_16S.txt 文件,其中包含不同长度的段落,顶部带有唯一代码(例如 16S317)。转移到 R 后,我有一个包含 413 名成员的列表,如下所示:

[1]">16S317_V._rotiferianus_A\n
AAATTGAAGAGTTTGATCATGGCTCAG..."
[2]">16S318_Salmonella_bongori\n
AAATTGAAGAGTTTGATCATGGCTCAGATT..."
[3]">16S319_Escherichia_coli\n
TTGAAGAGTTTGATCATGGCTCAGATTG...

我需要用 table Code_16S:

中的新代码替换现有代码
     Old    New
 1. 16S317 16S001
 2. 16S318 16S307 
 3. 16S319 16S211
 4.  ...    ...

任何人都可以建议一个代码来识别旧代码并将其替换为新代码吗? 考虑到我们在新列和旧列中有相同的代码,因此对整个列表直接应用 gsubreplace 是行不通的(在替换后我们有两个具有相同代码的段落,所以一个接下来的步骤将更改它们)。

下面是我对问题的解决方案,但我认为它不是最佳方案。

只要新代码按照旧代码排序,对应文件中段落的顺序,我们就可以逐段进行替换。 (最初 table 按列 New 排序)

Num = seq.int(1:413)   # total number of paragraphs
Code_16S = codes$New   

F_16S = function(x) {
  row = code_16S[x]
  gsub("^.{7}", paste(">", row, sep = ""), FASTA_16S[[1]][x])
}

N_16S = lapply(Num, F_16S)

使用 gsub("^[>].{7}", 我尝试替换每个字符串中除第一个字符 (>) 之外的前 6 个字符(代码),但它不起作用,因此添加了 paste功能。

而不是使用 lapply,使用 str_replace_all

可能更容易
library(stringr)
library(tibble)
FASTA_16S <- str_replace_all(FASTA_16S, deframe(Code_16S))

-输出

FASTA_16S
[1] ">16S001_V._rotiferianus_A\n\nAAATTGAAGAGTTTGATCATGGCTCAG..."   
[2] ">16S307_Salmonella_bongori\n\nAAATTGAAGAGTTTGATCATGGCTCAGATT..."

数据

FASTA_16S <- c(">16S317_V._rotiferianus_A\n\nAAATTGAAGAGTTTGATCATGGCTCAG...", 
">16S318_Salmonella_bongori\n\nAAATTGAAGAGTTTGATCATGGCTCAGATT..."
)
Code_16S <- structure(list(Old = c("16S317", "16S318", "16S319"), New = c("16S001", 
"16S307", "16S211")), class = "data.frame", row.names = c("1.", 
"2.", "3."))