我有一个以这种格式的字符串数组(n = 1000):
strings<-c("GSM1264936_2202_4866_28368_150cGy-GCSF6-m3_Mouse430A+2.CEL.gz",
"GSM1264937_2202_4866_28369_150cGy-GCSF6-m4_Mouse430A+2.CEL.gz",
"GSM1264938_2202_4866_28370_150cGy-GCSF6-m5_Mouse430A+2.CEL.gz")
我想知道这可能是一个简单的方法:
strings2<-c(2201_4866_28368_150cGy-GCSF6-m3_Mouse430A+2.CEL,
2202_4866_28369_150cGy-GCSF6-m4_Mouse430A+2.CEL,
2203_4866_28370_150cGy-GCSF6-m5_Mouse430A+2.CEL)
表示从前面剪掉“GSM1234567”,从末尾剪下“.gz”。
答案 0 :(得分:2)
只需一个gsub
解决方案,匹配以数字和字母符号开始^
的字符串,*
的零次或多次,直到遇到_
并且(更确切地说) &#34;或&#34;)最后.gz
$
的片段或字符串。
gsub("^([[:alnum:]]*_)|(\\.gz)$", "", strings)
[1] "2202_4866_28368_150cGy-GCSF6-m3_Mouse430A+2.CEL"
[2] "2202_4866_28369_150cGy-GCSF6-m4_Mouse430A+2.CEL"
[3] "2202_4866_28370_150cGy-GCSF6-m5_Mouse430A+2.CEL"
我忘了逃避第二点。
答案 1 :(得分:1)
strings <- c("GSM1264936_2202_4866_28368_150cGy-GCSF6-m3_Mouse430A+2.CEL.gz", "GSM1264937_2202_4866_28369_150cGy-GCSF6-m4_Mouse430A+2.CEL.gz", "GSM1264938_2202_4866_28370_150cGy-GCSF6-m5_Mouse430A+2.CEL.gz")
strings2 <- lapply(strings, function (x) substr(x, 12, 58))
答案 2 :(得分:1)
您可以使用sub
:
sub('[^_]+_(.*)\\.gz', '\\1', strings)
# [1] "2202_4866_28368_150cGy-GCSF6-m3_Mouse430A+2.CEL"
# [2] "2202_4866_28369_150cGy-GCSF6-m4_Mouse430A+2.CEL"
# [3] "2202_4866_28370_150cGy-GCSF6-m5_Mouse430A+2.CEL"
答案 3 :(得分:0)
尝试:
gsub('^[^_]+_|\\.[^.]*$','',strings)
答案 4 :(得分:0)
我强烈建议分两步完成。其他解决方案有效,但完全不可读:它们不表达代码的 intent 。这是明确表达的:
trimmed_prefix = sub('^GSM\\d+_', '', strings)
strings2 = sub('\\.gz$', '', trimmed_prefix)
但诚然,这个可以一步表达,并且看起来不会太糟糕,如下所示:
strings2 = sub('^GSM\\d+_(.*)\\.gz$', '\\1', strings)
一般情况下,请仔细考虑您实际想要匹配的模式:您的问题是要匹配前缀“GSM1234567”,但您的示例与此相矛盾。我通常会选择尽可能具体的模式,以避免意外匹配错误的输入。