删除部分字符串

时间:2012-03-14 14:46:32

标签: r regex string

如何删除部分字符串?例如,在ATGAS_1121中,我想删除_之前的所有内容。

6 个答案:

答案 0 :(得分:109)

使用正则表达式。在这种情况下,您可以使用gsub

gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"

此正则表达式匹配字符串(^)的开头,任何字符(。)重复零次或多次(*)和下划线(_)。的?使匹配“懒惰”,以便它只匹配第一个下划线。该匹配仅替换为下划线。有关详细信息和参考资料,请参阅?regex

答案 1 :(得分:31)

您可以使用内置功能 strsplit

> s = "TGAS_1121"
> s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2]
> s1    
 [1] "1121"

strsplit split 参数解析后的两个部分作为列表返回。那可能不是你想要的,所以把调用包装在 unlist 中,然后 index 那个数组,这样只返回向量中两个元素中的第二个。

最后, fixed 参数应设置为TRUE,以指示split参数不是正则表达式,而是文字匹配字符。

答案 2 :(得分:17)

如果strsplit是向量,则s解决方案在这里:

> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"

答案 3 :(得分:15)

如果您是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"

答案 4 :(得分:3)

此处使用strsplit

的数据框的dplyr解决方案
col1 = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
col2 = c("T", "M", "A") 
df = data.frame(col1, col2)
df
        col1 col2
1  TGAS_1121    T
2  MGAS_1432    M
3 ATGAS_1121    A

df<-mutate(df,col1=as.character(col1))
df2<-mutate(df,col1=sapply(strsplit(df$col1, split='_', fixed=TRUE),function(x) (x[2])))
df2

  col1 col2
1 1121    T
2 1432    M
3 1121    A

答案 5 :(得分:0)

也许最直观的解决方案可能是使用字符串函数str_replace

示例中唯一棘手的部分是您想保留下划线,但可能的是:您必须匹配正则表达式,直到找到指定的字符串模式(?=pattern)

查看示例:

strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
strings %>% str_remove(".+?(?=_)")

[1] "_1121" "_1432" "_1121"