我下面有这样的字符串

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")

我想删除第5个_之前的所有内容和第6个_之后的所有内容。
我想要的结果是:S50, S50, S62
我可以通过执行类似sub("^(.*?_.*?_.*?_.*?_.*?_.*?)_.*", "\\1", tt)的操作来分多个步骤进行操作,但是我想知道是否有更好的单步执行方法。

最佳答案

您可以使用strsplit

sapply(strsplit(tt, "_"), "[[", 6)
#[1] "S50" "S50" "S62"

说明:我们使用 vector 化的strsplit在每个tt上分割"_",从而得到list;然后sapply(..., "[[", 6)从每个list元素中提取第6个元素。

或者,您可以使用显式匿名函数
sapply(strsplit(tt, "_"), function(x) x[6])

08-19 13:38