web-dev-qa-db-fra.com

Extraire une partie numérique de chaînes de nombres et de caractères mixtes dans R

J'ai beaucoup de chaînes, et chacune d'elles a généralement le format suivant: Ab_Cd-001234.txt Je veux le remplacer par 001234. Comment puis-je y parvenir en R?

21
user288609

En utilisant gsub ou sub, vous pouvez faire ceci:

 gsub('.*-([0-9]+).*','\\1','Ab_Cd-001234.txt')
"001234"

vous pouvez utiliser regexpr avec regmatches

m <- gregexpr('[0-9]+','Ab_Cd-001234.txt')
regmatches('Ab_Cd-001234.txt',m)
"001234"

EDIT les 2 méthodes sont vectorisées et fonctionnent pour un vecteur de chaînes.

x <- c('Ab_Cd-001234.txt','Ab_Cd-001234.txt')
sub('.*-([0-9]+).*','\\1',x)
"001234" "001234"

 m <- gregexpr('[0-9]+',x)
> regmatches(x,m)
[[1]]
[1] "001234"

[[2]]
[1] "001234"
21
agstudy

Le paquet stringr propose de nombreux raccourcis pratiques pour ce type de travail:

# input data following @agstudy
data <-  c('Ab_Cd-001234.txt','Ab_Cd-001234.txt')

# load library
library(stringr)

# prepare regular expression
regexp <- "[[:digit:]]+"

# process string
str_extract(data, regexp)

Which gives the desired result:

  [1] "001234" "001234"

Pour expliquer un peu l'expression rationnelle:

[[:digit:]] est un nombre compris entre 0 et 9

+ signifie que l'élément précédent (dans ce cas, un chiffre) sera mis en correspondance une ou plusieurs fois

Cette page est également très utile pour ce type de traitement de chaîne: http://en.wikibooks.org/wiki/R_Programming/Text_Processing

24
Ben

Vous pouvez utiliser genXtract à partir du package qdap. Cela prend une chaîne de caractères gauche et une chaîne de caractères droite et extrait les éléments entre.

library(qdap)
genXtract("Ab_Cd-001234.txt", "-", ".txt")

Bien que je préfère de loin la réponse d'Agstudy.

MODIFIER Extension de la réponse pour correspondre à l'agstudy:

x <- c('Ab_Cd-001234.txt','Ab_Cd-001234.txt')
genXtract(x, "-", ".txt")

# $`-  :  .txt1`
# [1] "001234"
# 
# $`-  :  .txt2`
# [1] "001234"
4
Tyler Rinker

gsub Supprimer le préfixe et le suffixe:

gsub(".*-|\\.txt$", "", x)

package d'outils Utilisez file_path_sans_ext des outils pour supprimer l'extension, puis utilisez sub pour supprimer le préfixe:

library(tools)
sub(".*-", "", file_path_sans_ext(x))

strapplyc Extraire les chiffres après - et avant le point. Voir page d'accueil de gsubfn pour plus d'informations:

library(gsubfn)
strapplyc(x, "-(\\d+)\\.", simplify = TRUE)

Notez que si vous vouliez retourner un numérique, nous pourrions utiliser strapply plutôt que strapplyc comme ceci:

strapply(x, "-(\\d+)\\.", as.numeric, simplify = TRUE)
2
G. Grothendieck