Zerlegung eines Strings

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
CatorCanulis
Beiträge: 2
Registriert: So Apr 05, 2020 9:34 am

Zerlegung eines Strings

Beitrag 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
Benutzeravatar
student
Beiträge: 674
Registriert: Fr Okt 07, 2016 9:52 am

Re: Zerlegung eines Strings

Beitrag von student »

Hallo Markus,

schau Dir mal das Paket stringr an.
Viele Grüße,
Student
-----------------------------------------------------------------------------------------------------------------------
faes.de, Datenanalyse mit R & das Ad-Oculos-Projekt
Das Ad-Oculos-Projekt auf YouTube

Habe Mut, dich deines eigenen Verstandes zu bedienen! (Kant)
Athomas
Beiträge: 768
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Zerlegung eines Strings

Beitrag 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)
Zuletzt geändert von Athomas am So Apr 05, 2020 11:29 am, insgesamt 1-mal geändert.
CatorCanulis
Beiträge: 2
Registriert: So Apr 05, 2020 9:34 am

Re: Zerlegung eines Strings

Beitrag von CatorCanulis »

Klappt! – verstehe noch nicht wie, aber es klappt :P

Vielen Dank.
Antworten