2 votes

Comment diviser un vecteur de caractères en fonction d'un vecteur numérique pour les positions

Je voudrais diviser un vecteur de caractères en sous-chaînes basées sur un deuxième vecteur numérique pour les points de division

vec <- "LAYRVCMTNEGHPWVSLVVQKTRLQISQDPSLNYEYLPTMGLKSFIQASLALLFGKHSQAIVENRVGGVHTVGDSGAFQLGVQFLRAWHKDARIVYIISSQKELHGLVFQDMGFTVYEYSVWDPKKLCMDPDILLNVVEQIPHGCVLVMGNIIDCKLTPSGWAKLMSM"
split.points <- c(25, 32, 55, 90, 124)

Je voudrais couper le vecteur de caractères ci-dessus aux positions données dans le vecteur split.points en six sous-chaînes différentes.

Ça semble très simple, mais la commande split que je connais fonctionne soit avec des regex spécifiques (motifs) soit avec une longueur fixe de sous-chaînes.

Je vous serais reconnaissant de toute aide.

6voto

mt1022 Points 10070

Nous pouvons essayer substring:

substring(
    vec,
    c(1, split.points + 1),
    c(split.points, nchar(vec))
)
# [1] "LAYRVCMTNEGHPWVSLVVQKTRLQ"                    "ISQDPSL"                                     
# [3] "NYEYLPTMGLKSFIQASLALLFG"                      "KHSQAIVENRVGGVHTVGDSGAFQLGVQFLRAWHK"         
# [5] "DARIVYIISSQKELHGLVFQDMGFTVYEYSVWDP"           "KKLCMDPDILLNVVEQIPHGCVLVMGNIIDCKLTPSGWAKLMSM"

4voto

Jaap Points 3814

Une autre alternative est d'utiliser read.fwf:

unlist(read.fwf(textConnection(vec), 
                widths = c(25, diff(split.points)), 
                as.is = TRUE), 
       use.names = FALSE)

ce qui donne:

[1] "LAYRVCMTNEGHPWVSLVVQKTRLQ"          
[2] "ISQDPSL"                            
[3] "NYEYLPTMGLKSFIQASLALLFG"            
[4] "KHSQAIVENRVGGVHTVGDSGAFQLGVQFLRAWHK"
[5] "DARIVYIISSQKELHGLVFQDMGFTVYEYSVWDP"

Je ne serais pas surpris si votre vecteur de caractères provient d'un fichier de données. Dans ce cas, read.fwf serait particulièrement utile. Voici un exemple:

vec2 <- "LAYRVCMTNEGHPWVSLVVQKTRLQISQDPSLNYEYLPTMGLKSFIQASLALLFGKHSQAIVENRVGGVHTVGDSGAFQLGVQFLRAWHKDARIVYIISSQKELHGLVFQDMGFTVYEYSVWDPKKLCMDPDILLNVVEQIPHGCVLVMGNIIDCKLTPSGWAKLMSM
LAYRVCMTNEGHPWVSLVVQKTRLQISQDPSLNYEYLPTMGLKSFIQASLALLFGKHSQAIVENRVGGVHTVGDSGAFQLGVQFLRAWHKDARIVYIISSQKELHGLVFQDMGFTVYEYSVWDPKKLCMDPDILLNVVEQIPHGCVLVMGNIIDCKLTPSGWAKLMSM"

read.fwf(textConnection(vec2), 
         widths = c(25, diff(split.points)), 
         as.is=TRUE)

ce qui donnera:

                         V1      V2                      V3                                  V4                                 V5
1 LAYRVCMTNEGHPWVSLVVQKTRLQ ISQDPSL NYEYLPTMGLKSFIQASLALLFG KHSQAIVENRVGGVHTVGDSGAFQLGVQFLRAWHK DARIVYIISSQKELHGLVFQDMGFTVYEYSVWDP
2 LAYRVCMTNEGHPWVSLVVQKTRLQ ISQDPSL NYEYLPTMGLKSFIQASLALLFG KHSQAIVENRVGGVHTVGDSGAFQLGVQFLRAWHK DARIVYIISSQKELHGLVFQDMGFTVYEYSVWDP

3voto

akrun Points 148302

Nous pouvons utiliser séparer de tidyr

library(tidyverse)
data_frame(vec) %>%
      separate(vec, into = paste0('vec', 1:6), sep = split.points) %>% 
      unlist(., use.names = FALSE)
#[1] "LAYRVCMTNEGHPWVSLVVQKTRLQ"                    "ISQDPSL"                                      "NYEYLPTMGLKSFIQASLALLFG"                     
#[4] "KHSQAIVENRVGGVHTVGDSGAFQLGVQFLRAWHK"          "DARIVYIISSQKELHGLVFQDMGFTVYEYSVWDP"
#[6] "KKLCMDPDILLNVVEQIPHGCVLVMGNIIDCKLTPSGWAKLMSM"

Une option base R serait substr

unname(mapply(substr, vec, start = c(1, split.points+1), stop = c(split.points, nchar(vec))))
#[1] "LAYRVCMTNEGHPWVSLVVQKTRLQ"                    "ISQDPSL"                                      "NYEYLPTMGLKSFIQASLALLFG"                     
#[4] "KHSQAIVENRVGGVHTVGDSGAFQLGVQFLRAWHK"          "DARIVYIISSQKELHGLVFQDMGFTVYEYSVWDP"           "KKLCMDPDILLNVVEQIPHGCVLVMGNIIDCKLTPSGWAKLMSM"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X