2016-07-14 2 views
1

Diese Frage ist sehr einfach zu verstehen, aber ich kann mir nicht vorstellen, wie man eine Lösung bekommt. Lassen Sie uns sagen, ich habe einen Vektor und ich möchte es ändern, so dass es 5 ganze Zahlen am Ende haben würde, und fehlende Stellen mit Nullen ersetzt:Wie ändert man die Zeichenkette in R unter Berücksichtigung der Anzahl der Symbole, die Sie ändern möchten

Smth1  Smth00001 
Smth22 Smth00022 
Smth333 Smth00333 
Smth4444 Smth04444 
Smth55555 Smth55555 

Ich denke, es mit regex und Funktionen wie gsub getan werden kann, aber nicht verstehen, wie zu berücksichtigen, um die Länge der ersetzten Zeichenkette

+0

nicht wirklich, dww. Eine Person schlug str_pad aus stringr vor und es löst wirklich das Problem, obwohl die Person über smth gefragt hat, sonst –

Antwort

2

Hier ist eine Idee mit stringi:

v <- c("Smth1", "Smth22", "Smth333", "Smth4444", "Smth55555") 

library(stringi) 
d <- stri_extract(v, regex = "[:digit:]+") 
a <- stri_extract(v, regex = "[:alpha:]+") 
paste0(a, stri_pad_left(d, 5, "0")) 

Welche gibt:

[1] "Smth00022" "Smth00333" "Smth04444" "Smth55555" 
-1

Hier ist eine Lösung, die die Bibliothek mit stringr:

library(stringr) 
library(dplyr) 

num <- str_extract(v, "[1-9]+") 
padding <- 9 - nchar(num) 
ouput <- paste0(str_extract(v, "[^0-9]+") %>% 
       str_pad(width = padding, side = c("right"), pad = "0"), num) 

Die Ausgabe lautet:

"Smth00001" "Smth00022" "Smth00333" "Smth04444" "Smth55555" 
2

Mit Jemand Basis R. sonst die Regex prettify kann:

sprintf("%s%05d", gsub("^([^0-9]+)..*$", "\\1", x), 
    as.numeric(gsub("^..*[^0-9]([0-9]+)$", "\\1", x))) 

[1] "Smth00001" "Smth00022" "Smth00333" "Smth04444" "Smth55555" 
2

Hier eine einfache 1-Zeilen-Lösung ähnlich Zelazny's, aber mit einer Callback-Methode ersetzen innerhalb einer gsubfn mit gsubfn Bibliothek:

> library(gsubfn) 
> v <- c("Smth1", "Smth22", "Smth333", "Smth4444", "Smth55555") 
> gsubfn('[0-9]+$', ~ sprintf("%05d",as.numeric(x)), v) 
[1] "Smth00001" "Smth00022" "Smth00333" "Smth04444" "Smth55555" 

die Regex [0-9]+$ (siehe regex demo) Spielen 1 oder mehr Ziffern am Ende der Zeichenkette nur aufgrund des $ Anker. Die übereinstimmenden Ziffern werden an den Rückruf (~) übergeben und sprintf("%05d",as.numeric(x)) puffs die Zahl (als numerisch mit as.numeric analysiert) mit Nullen.

Um nur Strings zu ändern, die 1+ nicht-stellige Symbole am Anfang und dann 1 oder mehr Stellen bis zum Ende, das ist nur PCRE-basierte verwenden gsubfn:

> gsubfn('^[^0-9]+\\K([0-9]+)$', ~ sprintf("%05d",as.numeric(x)), v, perl=TRUE) 
[1] "Smth00001" "Smth00022" "Smth00333" "Smth04444" "Smth55555" 

wo

  • ^ - Beginn der Zeichenfolge
  • [^0-9]+\\K - Streichhölzer 1+ nicht-stellige Symbole und \K wird weglassen sie
  • ([0-9]+) - Gruppe 1 an den Rückruf übergeben
  • $ - Ende der Zeichenfolge.
+0

FYI, diese Lösung ist die einzige unter den Anwesenden, die 1 Regex-Match-Operation verwendet. –

+1

Ich weiß nicht, warum wir alle downvoted werden. Sehr elegante Lösung BTW +1 –

-1
library(stringr) 
paste0(str_extract(v,'\\D+'),str_pad(str_extract(v,'\\d+'),5,'left', '0')) 
#[1] "Smth00001" "Smth00022" "Smth00333" "Smth04444" "Smth55555" 
+0

Wie unterscheidet sich das von meiner Lösung mit 'Stringi'? –

Verwandte Themen