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)