【发布时间】:2012-03-31 01:04:54
【问题描述】:
如何删除字符串的一部分?例如在ATGAS_1121 中我想删除_ 之前的所有内容。
【问题讨论】:
如何删除字符串的一部分?例如在ATGAS_1121 中我想删除_ 之前的所有内容。
【问题讨论】:
使用正则表达式。在这种情况下,您可以使用gsub:
gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"
此正则表达式匹配字符串的开头 (^)、任何重复零次或多次的字符 (.) (*) 和下划线 (_)。这 ?使匹配“惰性”,以便它只匹配第一个下划线。该匹配项仅替换为一个下划线。请参阅?regex 了解更多详情和参考
【讨论】:
gsub("^.*_","_","ATGAS_1121_xxx") 的情况下,前一个正则表达式将匹配最后一个下划线。现已修复。
您可以为此使用内置的strsplit:
> s = "TGAS_1121"
> s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2]
> s1
[1] "1121"
strsplit 将在 split 参数上解析的字符串的 both 片段返回为 list。这可能不是您想要的,所以将调用包装在 unlist 中,然后在 index 该数组中,以便只返回向量中两个元素中的第二个。
最后,fixed参数要设置为TRUE,表示split参数不是正则表达式,而是文字匹配字符。
【讨论】:
如果您是 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"
【讨论】:
如果s 是向量,则这是strsplit 解决方案:
> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"
【讨论】:
也许最直观的解决方案可能是使用stringr 函数str_remove,它比str_replace 更容易,因为它只有1 个参数而不是2 个。
您的示例中唯一棘手的部分是您希望保留下划线,但这是可能的:您必须匹配正则表达式,直到它找到指定的字符串模式 (?=pattern)。
查看示例:
strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
strings %>% stringr::str_remove(".+?(?=_)")
[1] "_1121" "_1432" "_1121"
【讨论】:
这里是使用dplyr 包的数据框的strsplit 解决方案
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
【讨论】: