我有 row.names 像这样:
输入:
S1_S2_S3_S9_AAACTGATFSRYB
S3_S4_S12_S1_TTTTTTGATFSRYB
S9_S4_S12_S1_S2_S19_S22_GTGTTTGATFSRYB
,我想要以下内容:
S9_AAACTGATFSRYB
S1_TTTTTTGATFSRYB
S22_GTGTTTGATFSRYB
换句话说,我只想保留字母开头前的最后一个S *。 我总共有6000行
有人可以帮我写一个 gsub 或类似的东西来提取我需要的字符串吗?
答案 0 :(得分:5)
尝试
a =c(
"S1_S2_S3_S9_AAACTGATFSRYB",
"S3_S4_S12_S1_TTTTTTGATFSRYB",
"S9_S4_S12_S1_S2_S19_S22_GTGTTTGATFSRYB"
)
gsub("^.*_(.*_.+)$","\\1",a)
#> [1] "S9_AAACTGATFSRYB" "S1_TTTTTTGATFSRYB" "S22_GTGTTTGATFSRYB"
由reprex package(v0.2.0.9000)创建于2018-07-18。
编辑:在正则表达式上添加说明:
^.*_
匹配从开始(^
)到最后一个下划线的字符串(.*_.+)
匹配带下划线的字符串,结合第一部分,它将匹配我们想要的最后一个下划线和周围环境。()
和\1
:
后向引用\ N,其中N = 1 ... 9,与先前由正则表达式的第N个括号化的子表达式匹配的子字符串匹配。
答案 1 :(得分:1)
非 regex 解决方案:
sapply(strsplit(a, "_"), function(i) paste(tail(i, n = 2), collapse = "_"))
# [1] "S9_AAACTGATFSRYB" "S1_TTTTTTGATFSRYB" "S22_GTGTTTGATFSRYB"
答案 2 :(得分:0)
使用正则表达式和Stringr的替代方法
stringr::str_extract(a,"[^_]+_[^_]+$")
#[1] "S9_AAACTGATFSRYB" "S1_TTTTTTGATFSRYB" "S22_GTGTTTGATFSRYB"