我对R的资格不高,并且正在为一个问题而苦苦挣扎。我想用破折号“(-)”替换“ S11”模式之前的所有现有下划线。 S11只是一个数字,在我的表格中是可变的,例如S29,S30。这是我正在使用并失败的代码:
foo <- c("H2_2months_S11_L001_R1_001_(paired)_trimmed_(paired)_contig_940_[cov=11]_", "H2_2months_with_acetate_S101_L001_R1_001_(paired)_trimmed_(paired)_contig_940_[cov=11]_", "Formate_3months_S99_L001_R1_001_(paired)_trimmed_(paired)_contig_940_[cov=11]_")
Sample <- gsub(pattern="*(_S)", replacement="-", x=foo)
获取:
[1]“ H2_2months-11_L001_R1_001_(配对)已修剪(配对)_contig_940_ [cov = 11] _”
[2]“ H2_2months_with_acetate-101_L001_R1_001_(配对)修剪(配对)_contig_940_ [cov = 11] _”
[3]“ Formate_3months-99_L001_R1_001_(配对)已修剪(配对)_contig_940_ [cov = 11] _”
我也不希望删除"_S"
并将其替换。我使用"_S[0-9]"
作为匹配条件,在"_S"
之前,下划线应更改为"-"
。
也请向我推荐一个很好的网站,我可以在该功能中学习这些“代码或符号”。预先感谢。
预期输出:
[1]“ H2-2months-S11_L001_R1_001_(配对)已修剪(配对)_contig_940_ [cov = 11] _”
[2]“ H2-2个月含乙酸S101_L001_R1_001_(配对)修剪(配对)_contig_940_ [cov = 11] _”
[3]“ Formate-3months-S99_L001_R1_001_(配对)已修剪(配对)_contig_940_ [cov = 11] _”
答案 0 :(得分:1)
这将与“ _S11”匹配并将S11保存到组中。然后将其替换为“-”,后跟捕获的组“ S11”。
Sample <- gsub("_(S[0-9+])", "-\\1", foo)
一个学习更多正则表达式的好地方:https://www.regular-expressions.info/quickstart.html
测试正则表达式的绝佳场所,并提供以下匹配项的说明:https://regexr.com/
编辑:谢谢RLave,没有意识到S后面的数字可以是任何数字。
答案 1 :(得分:1)
这应该有效。
基本上,我们将作业分为两部分,首先是匹配("_(S[0-9+])"
,然后将结果字符串分割为"-"
,然后我们使用gsub
来修复所有{{1 }}我们找到了。
"_"
然后我们分开:
foo <- c("H2_2months_S123_L001_R1_001_(paired)_trimmed_(paired)_contig_940_[cov=11]_")
foo <- gsub(pattern="_(S[0-9+])", replacement="-\\1", x=foo)
#foo
#[1] "H2_2months-S123_L001_R1_001_(paired)_trimmed_(paired)_contig_940_[cov=11]_"
现在,我们可以对split <- unlist(strsplit(foo, "-")) # split using the new "-"
#split
#[1] "H2_2months"
#[2] "S123_L001_R1_001_(paired)_trimmed_(paired)_contig_940_[cov=11]_"
中的最后一个元素以外的所有内容使用简单的gsub
。
split
然后我们split_1 <- split[-length(split)] # fix all the "_" before the match (exclude the last)
split_1 <- gsub("_", "-", split_1)
结果:
paste
在函数中,还有另一个示例:
paste0(split_1, "-", split[length(split)]) # paste back together
#[1] "H2-2months-S123_L001_R1_001_(paired)_trimmed_(paired)_contig_940_[cov=11]_"