4

我有以下形式的变量名:

PP_Sample_12.GT

或者

PP_Sample-17.GT

我正在尝试使用字符串拆分来查找中间部分:即Sample_12Sample-17. 但是,当我这样做时:

IDtmp <- sapply(strsplit(names(df[c(1:13)]),'_'),function(x) x[2])
IDs <- data.frame(sapply(strsplit(IDtmp,'.GT',fixed=T),function(x) x[1]))

我结束了Samplefor PP_Sample_12.GT

还有另一种方法可以做到这一点吗?也许使用模式/替换功能?虽然,不确定这是否存在于 R 中(但我认为这可能适用于gsub

4

4 回答 4

4

使用此输入:

x <- c("PP_Sample_12.GT", "PP_Sample-17.GT")

1)strsplit。用点替换第一个下划线,然后按点分割:

spl <- strsplit(sub("_", ".", x), ".", fixed = TRUE)
sapply(spl, "[", 2)

2) gsub 将前缀(^[^_]*_)和后缀(\\.[^.]*$")替换为空字符串:

gsub("^[^_]*_|\\.[^.]*$", "", x)

3) gsubfn::strapplyc 提取下划线和点之间的所有内容。

library(gsubfn)
strapplyc(x, "_(.*)\\.", simplify = TRUE)
于 2014-05-06T21:24:17.447 回答
3

这是一个gsub将提取第一个之后_和最后一个之前的所有内容.

x<-c("PP_Sample-12.GT","PP_Sample-17.GT")
gsub(".*_(.*)\\..*","\\1", x, perl=T)
于 2014-05-06T19:43:47.490 回答
1

如果它们都以相同的字符开头和结尾,并且这些字符不在字符串的中间部分,则gsub表达式很简单:

> x <- c("PP_Sample-12.GT","PP_Sample-17.GT")
> gsub('[(PP_)|(.GT)]','',x)
[1] "Sample-12" "Sample-17
于 2014-05-06T19:45:21.150 回答
1

这会抓取2nd列表中被拆分的每个部分的元素,然后通过子集 function 将其简化为向量,[用于sapply为原始列表的每个元素调用此函数。

x <- c('PP_Sample_12.GT', 'PP_Sample-17.GT')
sapply(strsplit(x, '(?:_(?=\\D)|\\.GT)', perl = T), '[', 2)

[1] "Sample_12" "Sample-17"
于 2014-05-06T20:06:28.117 回答