如何在R中某些定界符位置之前和之后删除字符串?

时间:2019-05-23 16:53:32

标签: r string

我下面有这样的字符串

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)的操作来分多个步骤进行操作,但是我想知道是否有更好的单步执行方法。

2 个答案:

答案 0 :(得分:3)

您可以使用strsplit

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

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

或者,您可以使用显式的匿名函数

sapply(strsplit(tt, "_"), function(x) x[6])

答案 1 :(得分:3)

我们可以使用sub,方法是在开头(^)处放置锚点,然后放置5个不是_[^_]+)的字符实例,然后再放置一个_,然后捕获不是_([^_]+))的字符。在替换中,指定第二个捕获组(\\2

sub("^([^_]+_){5}([^_]+).*", "\\2", tt)
#[1] "S50" "S50" "S62"