根据旧的和更正的列表在文件中查找和替换 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. ... ...
任何人都可以建议一个代码来识别旧代码并将其替换为新代码吗?
考虑到我们在新列和旧列中有相同的代码,因此对整个列表直接应用 gsub
或 replace
是行不通的(在替换后我们有两个具有相同代码的段落,所以一个接下来的步骤将更改它们)。
下面是我对问题的解决方案,但我认为它不是最佳方案。
只要新代码按照旧代码排序,对应文件中段落的顺序,我们就可以逐段进行替换。
(最初 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."))
我有一个 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. ... ...
任何人都可以建议一个代码来识别旧代码并将其替换为新代码吗?
考虑到我们在新列和旧列中有相同的代码,因此对整个列表直接应用 gsub
或 replace
是行不通的(在替换后我们有两个具有相同代码的段落,所以一个接下来的步骤将更改它们)。
下面是我对问题的解决方案,但我认为它不是最佳方案。
只要新代码按照旧代码排序,对应文件中段落的顺序,我们就可以逐段进行替换。
(最初 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."))