Jos*_*ich 116
使用正则表达式.在这种情况下,您可以使用gsub:
gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"
Run Code Online (Sandbox Code Playgroud)
此正则表达式匹配字符串的开头(^),重复零次或多次(*)和下划线(_)的任何字符(.).的?使匹配"懒惰",以便它只匹配第一个下划线.该匹配仅替换为下划线.有关?regex详细信息和参考,请参阅
dou*_*oug 33
你可以使用内置的这个,strsplit:
> s = "TGAS_1121"
> s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2]
> s1
[1] "1121"
Run Code Online (Sandbox Code Playgroud)
strsplit将split参数上解析的两个字符串作为列表返回.这可能不是你想要的,所以将调用包装在unlist中,然后索引该数组,以便只返回向量中两个元素中的第二个.
最后,fixed参数应设置为TRUE以指示split参数不是正则表达式,而是文字匹配字符.
ver*_*our 20
strsplit如果s是向量,这是解决方案:
> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"
Run Code Online (Sandbox Code Playgroud)
nau*_*101 19
如果你是Tidyverse的人,这里是stringr解决方案:
R> library(stringr)
R> strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
R> strings %>% str_replace(".*_", "_")
[1] "_1121" "_1432" "_1121"
# Or:
R> strings %>% str_replace("^[A-Z]*", "")
[1] "_1121" "_1432" "_1121"
Run Code Online (Sandbox Code Playgroud)
也许最直观的解决方案可能是使用比该函数更简单的stringr函数,因为它只有 1 个参数而不是 2 个参数。str_removestr_replace
示例中唯一棘手的部分是您想要保留下划线,但它是可能的:您必须匹配正则表达式,直到找到指定的字符串模式(?=pattern)。
参见示例:
strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
strings %>% stringr::str_remove(".+?(?=_)")
[1] "_1121" "_1432" "_1121"
Run Code Online (Sandbox Code Playgroud)