2014-09-10 4 views
0

J'ai une séquence comme celui-ci dans une liste "MSGSRRKATPASRTRVGNYEMGRTLGEGSFAKVKYAKNTVTGDQAAIKILDREKVFRHKMVEQLKREISTMKLIKHPNVVEIIEVMASKTKIYIVLELVNGGELFDKIAQQGRLKEDEARRYFQQLINAVDYCHSRGVYHRDLKPENLILDANGVLKVSDFGLSAFSRQVREDGLLHTACGTPNYVAPEVLSDKGYDGAAADVWSCGVILFVLMAGYLPFDEPNLMTLYKRICKAEFSCPPWFSQGAKRVIKRILEPNPITRISIAELLEDEWFKKGYKPPSFDQDDEDITIDDVDAAFSNSKECLVTEKKEKPVSMNAFELISSSSEFSLENLFEKQAQLVKKETRFTSQRSASEIMSKMEETAKPLGFNVRKDNYKIKMKGDKSGRKGQLSVATEVFEVAPSLHVVELRKTGGDTLEFHKVCDSFYKNFSSGLKDVVWNTDAAAEEQKQ"Regex/Substring

Je voudrais créer une sous-chaîne, comme chaque fois qu'un « K » est présent, il a besoin de se retirer 6 caractères avant et 6 caractères après « K »

Ex: MSGSRRKATPASR, ici -6..K .. + 6

pour toute sequence..I a essayé la fonction de sous-chaîne en R, mais nous avons besoin de préciser la position de début et de fin. Ici, les positions ne sont pas connus

Merci

+3

Ce qui se passe lorsque vous avez deux 'K' dans les 6 lettres les unes des autres dans liike' LEDEWFKKGYKPP'? –

+0

Article pertinent sur [Biostars] (https://www.biostars.org/p/109077) – zx8754

Répondre

3

L'utilisation rex peut faire ce type de tâche un peu plus simple.

x <- "MSGSRRKATPASRTRVGNYEMGRTLGEGSFAKVKYAKNTVTGDQAAIKILDREKVFRHKMVEQLKREISTMKLIKHPNVVEIIEVMASKTKIYIVLELVNGGELFDKIAQQGRLKEDEARRYFQQLINAVDYCHSRGVYHRDLKPENLILDANGVLKVSDFGLSAFSRQVREDGLLHTACGTPNYVAPEVLSDKGYDGAAADVWSCGVILFVLMAGYLPFDEPNLMTLYKRICKAEFSCPPWFSQGAKRVIKRILEPNPITRISIAELLEDEWFKKGYKPPSFDQDDEDITIDDVDAAFSNSKECLVTEKKEKPVSMNAFELISSSSEFSLENLFEKQAQLVKKETRFTSQRSASEIMSKMEETAKPLGFNVRKDNYKIKMKGDKSGRKGQLSVATEVFEVAPSLHVVELRKTGGDTLEFHKVCDSFYKNFSSGLKDVVWNTDAAAEEQKQ" 

library(rex) 
re_matches(x, 
    rex(
    capture(name = "amino_acids", 
     n(any, 6), 
     "K", 
     n(any, 6) 
    ) 
), 
    global = TRUE)[[1]] 
#>  amino_acids 
#>1 MSGSRRKATPASR 
#>2 GEGSFAKVKYAKN 
#>3 GDQAAIKILDREK 
#>4 KMVEQLKREISTM 
#>5 IEVMASKTKIYIV 
#>6 GGELFDKIAQQGR 
#>7 VYHRDLKPENLIL 
#>8 DANGVLKVSDFGL 
#>9 PEVLSDKGYDGAA 
#>10 NLMTLYKRICKAE 
#>11 WFSQGAKRVIKRI 
#>12 LEDEWFKKGYKPP 
#>13 AAFSNSKECLVTE 
#>14 LENLFEKQAQLVK 
#>15 ASEIMSKMEETAK 
#>16 LGFNVRKDNYKIK 
#>17 GDKSGRKGQLSVA 
#>18 HVVELRKTGGDTL 
#>19 VCDSFYKNFSSGL 

Cependant, comme ce qui précède est gourmand, chaque K n'apparaîtra que dans un résultat.

Si vous voulez une sortie AA pour chaque K

library(rex) 
locs <- re_matches(x, 
    rex(
    "K" %if_prev_is% n(any, 6) %if_next_is% n(any, 6) 
    ), 
    global = TRUE, locations = TRUE)[[1]] 

substring(x, locs$start - 6, locs$end + 6) 
#> [1] "MSGSRRKATPASR" "GEGSFAKVKYAKN" "GSFAKVKYAKNTV" "AKVKYAKNTVTGD" 
#> [5] "GDQAAIKILDREK" "KILDREKVFRHKM" "EKVFRHKMVEQLK" "KMVEQLKREISTM" 
#> [9] "REISTMKLIKHPN" "STMKLIKHPNVVE" "IEVMASKTKIYIV" "VMASKTKIYIVLE" 
#>[13] "GGELFDKIAQQGR" "AQQGRLKEDEARR" "VYHRDLKPENLIL" "DANGVLKVSDFGL" 
#>[17] "PEVLSDKGYDGAA" "NLMTLYKRICKAE" "LYKRICKAEFSCP" "WFSQGAKRVIKRI" 
#>[21] "GAKRVIKRILEPN" "LEDEWFKKGYKPP" "EDEWFKKGYKPPS" "WFKKGYKPPSFDQ" 
#>[25] "AAFSNSKECLVTE" "ECLVTEKKEKPVS" "CLVTEKKEKPVSM" "VTEKKEKPVSMNA" 
#>[29] "LENLFEKQAQLVK" "KQAQLVKKETRFT" "QAQLVKKETRFTS" "ASEIMSKMEETAK" 
#>[33] "KMEETAKPLGFNV" "LGFNVRKDNYKIK" "VRKDNYKIKMKGD" "KDNYKIKMKGDKS" 
#>[37] "NYKIKMKGDKSGR" "IKMKGDKSGRKGQ" "GDKSGRKGQLSVA" "HVVELRKTGGDTL" 
#>[41] "DTLEFHKVCDSFY" "VCDSFYKNFSSGL" "NFSSGLKDVVWNT" 
+0

Merci beaucoup :) – sane

4
.{6}K.{6} 

Try this.This donnera le résultat souhaité.

Voir la démo.

http://regex101.com/r/dM0rS8/4

+3

Pour exécuter ceci dans R, faites 'regmatches (x, gregexpr (". {6} K. {6} " , x, perl = TRUE)) 'quand' x' est la chaîne –

+0

@DavidArenburg thanx pour cela. – vks

4

utiliser ceci:

\w{7}(?<=K)\w{6} 

utilise ce lookbehind positif pour assurer qu'il y a des caractères présents avant K.

démo ici: http://regex101.com/r/pK3jK1/2

+0

Votre code n'a pas attraper le premier mot correctement –

+0

Il semble dans chacun d'eux. Il attrape toujours seulement 5 lettres avant 'K' –

+0

oui je l'ai remarqué et mis à jour .. en fait le lookbehind ne sélectionne pas un caractère alors pourquoi je devrais choisir 7 lettres – aelor