我下面有这样的字符串
tt <- c("16S_M_T1_R1_S1_S50_R1_001.fastq.gz", "16S_M_T1_R1_S1_S50_R2_001.fastq.gz",
"16S_M_T1_R1_S2_S62_R1_001.fastq.gz")
我想删除第五个_
之前的所有内容和第六个_
之后的所有内容。
我想要的结果是:
S50, S50, S62
我可以通过执行类似sub("^(.*?_.*?_.*?_.*?_.*?_.*?)_.*", "\\1", tt)
的操作来分多个步骤进行操作,但是我想知道是否有更好的单步执行方法。
答案 0 :(得分:3)
您可以使用strsplit
sapply(strsplit(tt, "_"), "[[", 6)
#[1] "S50" "S50" "S62"
说明:我们使用矢量化的strsplit
在每个tt
上拆分"_"
,得到list
; sapply(..., "[[", 6)
然后从每个list
元素中提取第6个元素。
或者,您可以使用显式的匿名函数
sapply(strsplit(tt, "_"), function(x) x[6])
答案 1 :(得分:3)
我们可以使用sub
,方法是在开头(^
)处放置锚点,然后放置5个不是_
([^_]+
)的字符实例,然后再放置一个_
,然后捕获不是_
(([^_]+)
)的字符。在替换中,指定第二个捕获组(\\2
)
sub("^([^_]+_){5}([^_]+).*", "\\2", tt)
#[1] "S50" "S50" "S62"