字符串在R中以条件分割

MAP*_*APK 24 regex string split r

我有这个mystring分隔符_.这里的条件是如果有两个或多个分隔符,我想在第二个分隔符处拆分,如果只有一个分隔符,我想分割".Recal"并得到result如下所示的分隔符.

mystring<-c("MODY_60.2.ReCal.sort.bam","MODY_116.21_C4U.ReCal.sort.bam","MODY_116.3_C2RX-1-10.ReCal.sort.bam","MODY_116.4.ReCal.sort.bam")
Run Code Online (Sandbox Code Playgroud)

结果

"MODY_60.2"  "MODY_116.21" "MODY_116.3"  "MODY_116.4"
Run Code Online (Sandbox Code Playgroud)

pic*_*ick 11

你可以使用 gsubfn

library(gsubfn)
f <- function(x,y,z) if (z=="_") y else strsplit(x, ".ReCal", fixed=T)[[1]][[1]]
gsubfn("([^_]+_[^_]+)(.).*", f, mystring, backref=2)
# [1] "MODY_60.2"   "MODY_116.21" "MODY_116.3"  "MODY_116.4" 
Run Code Online (Sandbox Code Playgroud)

这允许您有两个以上"_"的情况,并且您希望在第二个上分割,例如,

mystring<-c("MODY_60.2.ReCal.sort.bam",
            "MODY_116.21_C4U.ReCal.sort.bam",
            "MODY_116.3_C2RX-1-10.ReCal.sort.bam",
            "MODY_116.4.ReCal.sort.bam",
            "MODY_116.4_asdfsadf_1212_asfsdf",
            "MODY_116.5.ReCal_asdfsadf_1212_asfsdf",  # split by second "_", leaving ".ReCal"
            "MODY")

gsubfn("([^_]+_[^_]+)(.).*", f, mystring, backref=2)
# [1] "MODY_60.2"        "MODY_116.21"      "MODY_116.3"       "MODY_116.4"      
# [5] "MODY_116.4"       "MODY_116.5.ReCal" "MODY"            
Run Code Online (Sandbox Code Playgroud)

在功能方面,f,x是原始的字符串,y并且z是一个相匹配.因此,如果z不是"_",则继续通过替代字符串进行拆分.


Pie*_*une 5

stringr包裹:

str_extract(mystring, '.*?_.*?(?=_)|^.*?_.*(?=\\.ReCal)')
[1] "MODY_60.2" "MODY_116.21" "MODY_116.3" "MODY_116.4"
Run Code Online (Sandbox Code Playgroud)

它也适用于两个以上的分隔符.


hwn*_*wnd 5

Perl/PCRE具有分支重置功能,允许您在使用不同备选方案捕获组时重用组号,并将其视为一个捕获组.

IMO,当您想提供不同的替代品时,此功能非常优雅.

x <- c('MODY_60.2.ReCal.sort.bam', 'MODY_116.21_C4U.ReCal.sort.bam', 
       'MODY_116.3_C2RX-1-10.ReCal.sort.bam', 'MODY_116.4.ReCal.sort.bam',
       'MODY_116.4_asdfsadf_1212_asfsdf', 'MODY_116.5.ReCal_asdfsadf_1212_asfsdf', 'MODY')

sub('^(?|([^_]*_[^_]*)_.*|(.*)\\.ReCal.*)$', '\\1', x, perl=T)
# [1] "MODY_60.2"        "MODY_116.21"      "MODY_116.3"       "MODY_116.4"      
# [5] "MODY_116.4"       "MODY_116.5.ReCal" "MODY"  
Run Code Online (Sandbox Code Playgroud)