如何在R中的字符串中为每个第二个单词添加引号
How to add quotes to every 2nd word in a string in R
我想在这个字符串中的每个第二个单词周围添加双引号。
由此
gene_id ENSG00000081237; gene_version 20; transcript_id ENST00000442510; transcript_version 8;
gene_type protein_coding; gene_name CD45A;
至此
gene_id "ENSG00000081237"; gene_version "20"; transcript_id "ENST00000442510"; transcript_version "8";
gene_type "protein_coding"; gene_name "CD45A";
我一直在寻找 tidyverse 和 stringr,但还没有找到好的方法。
谢谢!
这里有一种方法可以将字符串分开,将引号添加到每个其他项目,然后再粘贴回去。
x = "gene_id ENSG00000081237; gene_version 20; transcript_id ENST00000442510; transcript_version 8; gene_type protein_coding; gene_name CD45A;"
x = unlist(strsplit(x, " "))
evens = seq(2, length(x), by = 2)
x[evens] = paste0('"', x[evens])
x[evens] = sub(';', '";', x[evens], fixed = TRUE)
x = paste(x, collapse = " ")
cat(x)
# gene_id "ENSG00000081237"; gene_version "20"; transcript_id "ENST00000442510"; transcript_version "8"; gene_type "protein_coding"; gene_name "CD45A";
这是基本的 R 方法。
先把字符串末尾的;
去掉,然后把基因信息的向量按;
切分,再按空的space " "切分,保存到a新向量 vec_apply
.
之后,将未修改的拆分字符串与修改后的字符串(具有新双引号的字符串)一起粘贴回去。
请注意,在控制台中,双引号前面会加上反斜杠 \
以“转义”双引号。但是在将矢量保存到文本文件后,反斜杠将消失。
vec <- c("gene_id ENSG00000081237; gene_version 20; transcript_id ENST00000442510; transcript_version 8; gene_type protein_coding; gene_name CD45A;")
vec <- gsub(";$", "", vec)
vec_apply <- str_split_fixed(vec, "; ", n = str_count(string = vec, pattern = ";") + 1) %>%
strsplit(split = " ")
paste(sapply(vec_apply, `[[`, 1),
sapply(vec_apply, function(x) paste0(shQuote(x[[2]], type = "cmd"), ";")), collapse = " ")
控制台输出
"gene_id \"ENSG00000081237\"; gene_version \"20\"; transcript_id \"ENST00000442510\"; transcript_version \"8\"; gene_type \"protein_coding\"; gene_name \"CD45A\";"
在文本文件中输出
gene_id "ENSG00000081237"; gene_version "20"; transcript_id "ENST00000442510"; transcript_version "8"; gene_type "protein_coding"; gene_name "CD45A";
或者按照@GregorThomas 在另一个答案中的建议,使用cat()
查看输出以检查双引号是否添加成功。
cat(paste(sapply(vec_apply, `[[`, 1),
sapply(vec_apply, function(x) paste0(shQuote(x[[2]], type = "cmd"), ";")), collapse = " "))
gene_id "ENSG00000081237"; gene_version "20"; transcript_id "ENST00000442510"; transcript_version "8"; gene_type "protein_coding"; gene_name "CD45A";
我想在这个字符串中的每个第二个单词周围添加双引号。
由此
gene_id ENSG00000081237; gene_version 20; transcript_id ENST00000442510; transcript_version 8;
gene_type protein_coding; gene_name CD45A;
至此
gene_id "ENSG00000081237"; gene_version "20"; transcript_id "ENST00000442510"; transcript_version "8";
gene_type "protein_coding"; gene_name "CD45A";
我一直在寻找 tidyverse 和 stringr,但还没有找到好的方法。
谢谢!
这里有一种方法可以将字符串分开,将引号添加到每个其他项目,然后再粘贴回去。
x = "gene_id ENSG00000081237; gene_version 20; transcript_id ENST00000442510; transcript_version 8; gene_type protein_coding; gene_name CD45A;"
x = unlist(strsplit(x, " "))
evens = seq(2, length(x), by = 2)
x[evens] = paste0('"', x[evens])
x[evens] = sub(';', '";', x[evens], fixed = TRUE)
x = paste(x, collapse = " ")
cat(x)
# gene_id "ENSG00000081237"; gene_version "20"; transcript_id "ENST00000442510"; transcript_version "8"; gene_type "protein_coding"; gene_name "CD45A";
这是基本的 R 方法。
先把字符串末尾的;
去掉,然后把基因信息的向量按;
切分,再按空的space " "切分,保存到a新向量 vec_apply
.
之后,将未修改的拆分字符串与修改后的字符串(具有新双引号的字符串)一起粘贴回去。
请注意,在控制台中,双引号前面会加上反斜杠 \
以“转义”双引号。但是在将矢量保存到文本文件后,反斜杠将消失。
vec <- c("gene_id ENSG00000081237; gene_version 20; transcript_id ENST00000442510; transcript_version 8; gene_type protein_coding; gene_name CD45A;")
vec <- gsub(";$", "", vec)
vec_apply <- str_split_fixed(vec, "; ", n = str_count(string = vec, pattern = ";") + 1) %>%
strsplit(split = " ")
paste(sapply(vec_apply, `[[`, 1),
sapply(vec_apply, function(x) paste0(shQuote(x[[2]], type = "cmd"), ";")), collapse = " ")
控制台输出
"gene_id \"ENSG00000081237\"; gene_version \"20\"; transcript_id \"ENST00000442510\"; transcript_version \"8\"; gene_type \"protein_coding\"; gene_name \"CD45A\";"
在文本文件中输出
gene_id "ENSG00000081237"; gene_version "20"; transcript_id "ENST00000442510"; transcript_version "8"; gene_type "protein_coding"; gene_name "CD45A";
或者按照@GregorThomas 在另一个答案中的建议,使用cat()
查看输出以检查双引号是否添加成功。
cat(paste(sapply(vec_apply, `[[`, 1),
sapply(vec_apply, function(x) paste0(shQuote(x[[2]], type = "cmd"), ";")), collapse = " "))
gene_id "ENSG00000081237"; gene_version "20"; transcript_id "ENST00000442510"; transcript_version "8"; gene_type "protein_coding"; gene_name "CD45A";