Ich möchte Daten des Formulars übernehmen
before = data.frame(attr = c(1,30,4,6), type=c('foo_and_bar','foo_and_bar_2'))
attr type
1 1 foo_and_bar
2 30 foo_and_bar_2
3 4 foo_and_bar
4 6 foo_and_bar_2
und benutze split()
auf der Spalte " type
" von oben, um so etwas zu bekommen:
attr type_1 type_2
1 1 foo bar
2 30 foo bar_2
3 4 foo bar
4 6 foo bar_2
Ich habe mir etwas unglaublich Komplexes ausgedacht, das eine Form davon beinhaltet apply
, aber seitdem habe ich das verlegt. Es schien viel zu kompliziert, um der beste Weg zu sein. Ich kann strsplit
wie folgt verwenden, aber dann unklar, wie man das wieder in 2 Spalten im Datenrahmen bekommt.
> strsplit(as.character(before$type),'_and_')
[[1]]
[1] "foo" "bar"
[[2]]
[1] "foo" "bar_2"
[[3]]
[1] "foo" "bar"
[[4]]
[1] "foo" "bar_2"
Vielen Dank für Hinweise. Ich habe R-Listen noch nicht ganz durchgearbeitet.
left_right <- str_split_fixed(as.character(split_df),'\">',2)
str_split_fixed("aaa...bbb", fixed("..."), 2)
funktioniert gut mitfixed()
"Match a fixed string" impattern=
Argument..
bedeutet "beliebiges Zeichen" in Regex.Eine weitere Option ist die Verwendung des neuen Tidyr-Pakets.
quelle
str_split_fixed
und Spalten zu einem vorhandenen Datenrahmen hinzufügen).5 Jahre später Hinzufügen der obligatorischen
data.table
LösungWir könnten auch beide sicherstellen, dass die resultierenden Spalten die richtigen Typen haben und die Leistung durch Hinzufügen
type.convert
undfixed
Argumente verbessern (da dies"_and_"
nicht wirklich ein regulärer Ausdruck ist).quelle
'_and_'
Muster variiert, können Sie die maximale Anzahl von Übereinstimmungen (dh zukünftige Spalten) mitmax(lengths(strsplit(before$type, '_and_')))
strsplit
, wird ein einzelner Vektor mit 2 Werten in jedem Slot erstellt.tstrsplit
Transponieren Sie ihn daher in 2 Vektoren mit jeweils einem einzelnen Wert.paste0
wird nur verwendet, um die Spaltennamen zu erstellen, es wird nicht für die Werte verwendet. Auf der linken Seite der Gleichung befinden sich die Spaltennamen, auf der rechten Seite die Split + Transponierungsoperation für die Spalte.:=
steht für " Zuweisen an Ort und Stelle ", daher wird der<-
Zuweisungsoperator dort nicht angezeigt.Noch ein anderer Ansatz: Verwendung
rbind
aufout
:Und zu kombinieren:
quelle
strcapture("(.*)_and_(.*)", as.character(before$type), data.frame(type_1 = "", type_2 = ""))
Beachten Sie, dass sapply with "[" verwendet werden kann, um entweder das erste oder das zweite Element in diesen Listen zu extrahieren.
Und hier ist eine gsub-Methode:
quelle
Hier ist ein Einzeiler nach dem Vorbild von Anikos Lösung, jedoch mit Hadleys Stringr-Paket:
quelle
stringr
Paket.Um die Optionen zu erweitern, können Sie meine
splitstackshape::cSplit
Funktion auch folgendermaßen verwenden :quelle
Ein einfacher Weg ist die Verwendung
sapply()
und die[
Funktion:Beispielsweise:
sapply()
Das Ergebnis ist eine Matrix und muss transponiert und in einen Datenrahmen zurückgesetzt werden. Es sind dann einige einfache Manipulationen, die das gewünschte Ergebnis liefern:An diesem Punkt
after
ist, was Sie wolltenquelle
Das Thema ist fast erschöpft, ich möchte jedoch eine Lösung für eine etwas allgemeinere Version anbieten, bei der Sie die Anzahl der Ausgabespalten a priori nicht kennen. So haben Sie zum Beispiel
Wir können dplyr nicht verwenden,
separate()
da wir die Anzahl der Ergebnisspalten vor dem Teilen nicht kennen. Daher habe ich eine Funktion erstellt, mitstringr
der eine Spalte unter Berücksichtigung des Musters und eines Namenspräfix für die generierten Spalten geteilt wird. Ich hoffe die verwendeten Codierungsmuster sind korrekt.Wir können dann
split_into_multiple
in einem dplyr-Rohr wie folgt verwenden:Und dann können wir
gather
aufräumen ...quelle
Hier ist ein Basis-R-One-Liner, der eine Reihe vorheriger Lösungen überlappt, aber einen data.frame mit den richtigen Namen zurückgibt.
Es wird verwendet
strsplit
, um die Variable aufzubrechen unddata.frame
mitdo.call
/rbind
die Daten wieder in einen data.frame zu stellen. Die zusätzliche inkrementelle Verbesserung ist die Verwendung vonsetNames
, um dem data.frame Variablennamen hinzuzufügen.quelle
Diese Frage ist ziemlich alt, aber ich werde die Lösung hinzufügen, die ich derzeit als die einfachste empfand.
quelle
Seit R Version 3.4.0 können Sie
strcapture()
aus dem Utils- Paket (das in Base R-Installationen enthalten ist) die Ausgabe an die anderen Spalten binden.quelle
Ein anderer Ansatz, bei dem Sie bleiben möchten,
strsplit()
ist die Verwendung desunlist()
Befehls. Hier ist eine Lösung in dieser Richtung.quelle
Basis aber wahrscheinlich langsam:
quelle
Hier ist eine andere Basis-R-Lösung. Wir können verwenden,
read.table
aber da es nur ein Byte-sep
Argument akzeptiert und wir hier ein Multi-Byte-Trennzeichen haben, können wirgsub
das Multibyte-Trennzeichen durch ein beliebiges Ein-Byte-Trennzeichen ersetzen und dieses alssep
Argument in verwendenread.table
In diesem Fall können wir es auch kürzer machen, indem
sep
wir es durch ein Standardargument ersetzen, sodass wir es nicht explizit erwähnen müssenquelle