2 votes

Séparer une colonne en faisant correspondre des chaînes de caractères

J'ai un cadre de données qui ressemble plus ou moins à ceci :

name_position
RAHEEM STERLINGForward
MARCUS RASHFORDForward
JORDAN HENDERSONMidfielder
JORDAN PICKFORDGoalkeeper
KYLE WALKERDefender

Mon but est de créer deux colonnes de la précédente, j'ai donc créé un vecteur contenant toutes les positions disponibles

positions <- c("Goalkeeper", "Defender", "Midfielder", "Forward")

Ensuite, j'ai essayé avec des fonctions telles que separate() , extract() ou même str_match mais je ne parviens pas à obtenir le résultat que je souhaite obtenir, qui ressemblerait à ceci :

name                   position
RAHEEM STERLING        Forward
MARCUS RASHFORD        Forward
JORDAN HENDERSON       Midfielder
JORDAN PICKFORD        Goalkeeper
KYLE WALKER            Defender

2voto

akrun Points 148302

Nous pouvons utiliser separate avec une recherche par regex

library(dplyr)
library(tidyr)
df1 %>%
  separate(name_position, into = c("name", "position"), 
           sep="(?<=[A-Z])(?=[A-Z][a-z])")
#             name   position
#1  RAHEEM STERLING    Forward
#2  MARCUS RASHFORD    Forward
#3 JORDAN HENDERSON Midfielder
#4  JORDAN PICKFORD Goalkeeper
#5      KYLE WALKER   Defender

Si nous avons un vecteur personnalisé, une option est de créer un pat ternaire en créant une chaîne unique

library(stringr)
pat <- str_c(positions, collapse="|")
df1 %>% 
   transmute(name = str_remove(name_position, pat),
            position = str_extract(name_position, pat))

données

df1 <- structure(list(name_position = c("RAHEEM STERLINGForward", "MARCUS RASHFORDForward", 
"JORDAN HENDERSONMidfielder", "JORDAN PICKFORDGoalkeeper", 
"KYLE WALKERDefender"
)), class = "data.frame", row.names = c(NA, -5L))

2voto

Chris Ruehlemann Points 915

Utilisez str_extract de stringr :

df1$position <- str_extract(df1$name_position, "(?<=[A-Z])[A-Z][a-z]+")

Résultat :

df1
               name_position   position
1     RAHEEM STERLINGForward    Forward
2     MARCUS RASHFORDForward    Forward
3 JORDAN HENDERSONMidfielder Midfielder
4  JORDAN PICKFORDGoalkeeper Goalkeeper
5        KYLE WALKERDefender   Defender

Cette solution utilise le lookbehind positif :

(?<=[A-Z]) si vous voyez une lettre majuscule à gauche ...

[A-Z][a-z]+ ... correspond à la lettre majuscule suivante plus la ou les lettres minuscules qui la suivent

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