Seite 1 von 1

Zerlegung eines Strings

Verfasst: So Apr 05, 2020 9:53 am
von CatorCanulis
Hallo zusammen,

ein R-Skript generiert einen Vektor, in dem abwechselnd Buchstaben (A…Z, nur groß, keine Umlaute oder ähnliches) und Zahlen (Natürliche Zahlen von 1 bis unendlich) vorkommen.

Wie zerlege ich diese String am geschicktesten so, dass eine Matrix entsteht, in der in einer Spalte die Buchstaben und in der nächsten die darauffolgenden Zahlen stehen.

Beispiel:

Code: Alles auswählen

[1] "T18B4Y26T35P5I46F33C30O22G9E16"
in

Code: Alles auswählen

[,1][,2]
[1,] T 18
[2,] B 4
[3,] Y 2
…
[11,] E 16
Viele Grüße und besten Dank im Voraus
Markus

Re: Zerlegung eines Strings

Verfasst: So Apr 05, 2020 10:20 am
von student
Hallo Markus,

schau Dir mal das Paket stringr an.

Re: Zerlegung eines Strings

Verfasst: So Apr 05, 2020 10:41 am
von Athomas
Da hast Du aber Glück: ich habe vor gar nicht langer Zeit eine ähnliche Fragestellung gehabt!

Bei mir ging es darum, eine Zeichenkette in Vektoren aus reinen Text- bzw. Zahlenpassagen aufzubrechen - aber wenn man das hat, kann man daraus leicht eine Lösung für Deine Fragestellung basteln (s.u.).

Da ich keine "fertigen" Lösungen gefunden habe, musste ich mir selbst was basteln - ich habe dabei weder versucht, "exotische" Eingaben abzufangen noch irgendeine Performance-Optimierung vorgenommen:

Code: Alles auswählen

extrahiere <- function(Bezeichnung){                                              
  Stuecke    <- Bezeichnung
   
  Zahlen   <- gregexpr("[0-9\\.]+", Bezeichnung)[[1]]                            # wo befinden sich Folgen aus Zahlen (und Punkten)?
  l.Zahlen <- attr(Zahlen, "match.length")                                       # wie lang sind die Stücke?
    
  Texte    <- gregexpr("[A-z]+", Bezeichnung)[[1]]                               # Texte analog
  l.Texte  <- attr(Texte, "match.length")
    
  if(Zahlen[1]==-1 | Texte[1]==-1) return(Stuecke)                               # reine Zahl oder reiner Text; nix passiert
    
  Segmente <- data.frame(start = c(Zahlen, Texte), len = c(l.Zahlen, l.Texte))
  Segmente <- Segmente[Segmente$start > -1, ]
  Segmente <- Segmente[order(Segmente$start), ]
  ld       <- nrow(Segmente)
  Stuecke  <- rep("", ld)
    
  for (i in 1:ld) Stuecke[i] <- substr(Bezeichnung, Segmente$start[i], Segmente$start[i] + Segmente$len[i] - 1)
 
  return(Stuecke)                            
}
Und jetzt noch die Anpassung an Deine spezielle Frage:

Code: Alles auswählen

test <- "T18B4Y26T35P5I46F33C30O22G9E16"
matrix(extrahiere(test), byrow = TRUE, ncol=2)

Re: Zerlegung eines Strings

Verfasst: So Apr 05, 2020 11:26 am
von CatorCanulis
Klappt! – verstehe noch nicht wie, aber es klappt :P

Vielen Dank.