R Language
Modification des chaînes par substitution
Recherche…
Introduction
sub
et gsub
sont utilisés pour éditer des chaînes à l'aide de patterns. Reportez-vous à la section Correspondance et remplacement de motif pour plus d'informations sur les fonctions associées et les expressions régulières pour savoir comment créer un motif.
Réorganiser les chaînes de caractères à l'aide de groupes de capture
Si vous souhaitez modifier l'ordre des chaînes de caractères, vous pouvez utiliser des parenthèses dans le pattern
pour regrouper des parties de la chaîne. Ces groupes peuvent, dans l'argument de replacement
, être ajoutés à l'aide de nombres consécutifs.
L'exemple suivant montre comment vous pouvez réorganiser un vecteur de noms de la forme "nom de famille, prénom" en un vecteur de la forme "nom de famille".
library(randomNames)
set.seed(1)
strings <- randomNames(5)
strings
# [1] "Sigg, Zachary" "Holt, Jake" "Ortega, Sandra" "De La Torre, Nichole"
# [5] "Perkins, Donovon"
sub("^(.+),\\s(.+)$", "\\2 \\1", strings)
# [1] "Zachary Sigg" "Jake Holt" "Sandra Ortega" "Nichole De La Torre"
# [5] "Donovon Perkins"
Si vous n'avez besoin que du nom de famille, vous pouvez simplement répondre aux premières paires de parenthèses.
sub("^(.+),\\s(.+)", "\\1", strings)
# [1] "Sigg" "Holt" "Ortega" "De La Torre" "Perkins"
Éliminer les éléments consécutifs dupliqués
Disons que nous voulons éliminer l'élément de sous-séquence dupliqué d'une chaîne (il peut y en avoir plusieurs). Par exemple:
2,14,14,14,19
et le convertir en:
2,14,19
En utilisant gsub
, nous pouvons y arriver:
gsub("(\\d+)(,\\1)+","\\1", "2,14,14,14,19")
[1] "2,14,19"
Cela fonctionne aussi pour plusieurs répétitions différentes, par exemple:
> gsub("(\\d+)(,\\1)+", "\\1", "2,14,14,14,19,19,20,21")
[1] "2,14,19,20,21"
Expliquons l'expression régulière:
-
(\\d+)
: Un groupe 1 délimité par () et trouve n'importe quel chiffre (au moins un). Rappelez-vous que nous devons utiliser la double barre oblique inverse (\\
) car pour une variable de caractère, une barre oblique inverse représente un caractère d'échappement spécial pour les délimiteurs de chaîne littéraux (\"
ou\'
).\d\
est équivalent à:[0-9]
. -
,
Un signe de ponctuation:,
(nous pouvons inclure des espaces ou tout autre delimiter) -
\\1
: Une chaîne identique au groupe 1, c'est-à-dire le nombre répété. Si cela ne se produit pas, le motif ne correspond pas.
Essayons une situation similaire: éliminer les mots répétés consécutifs:
one,two,two,three,four,four,five,six
Ensuite, remplacez simplement \d
par \w
, où \w
correspond à n'importe quel caractère, y compris: toute lettre, chiffre ou trait de soulignement. C'est équivalent à [a-zA-Z0-9_]
:
> gsub("(\\w+)(,\\1)+", "\\1", "one,two,two,three,four,four,five,six")
[1] "one,two,three,four,five,six"
>
Ensuite, le modèle ci-dessus inclut comme cas particulier un cas de chiffres dupliqués.