如何在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";