Split-Daten-frame string-Spalte in mehrere Spalten
Nehme ich gerne die Daten des Formulars
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 verwenden split()
auf die Spalte "type
" von oben zu bekommen, so etwas wie dieses:
attr type_1 type_2
1 1 foo bar
2 30 foo bar_2
3 4 foo bar
4 6 foo bar_2
Kam ich mit etwas unglaublich Komplex, mit irgendeiner form von apply
das klappte auch, aber ich hab da verlegt dass. Es schien viel zu kompliziert, um es der beste Weg. Ich kann verwenden strsplit
als unten, aber dann unklar, wie man das wieder in 2 Spalten in der Daten-frame.
> 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 jegliche Hinweise. Ich habe nicht ganz groked R Listen nur noch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden
stringr::str_split_fixed
left_right <- str_split_fixed(as.character(split_df),'\">',2)
str_split_fixed("aaa...bbb", fixed("..."), 2)
funktioniert gut mitfixed()
zu "Match einen festen string" in derpattern=
argument..
bedeutet 'alle Zeichen' in regex.Weitere option ist die Verwendung der neuen tidyr Paket.
str_split_fixed
und hinzufügen von Spalten zu vorhandenen dataframe)?5 Jahre später das hinzufügen der obligatorischen
data.table
LösungKonnten wir auch die beiden stellen Sie sicher, dass die entstehenden Spalten werden die richtigen Arten und verbessern der Leistung durch das hinzufügen von
type.convert
undfixed
Argumente (da"_and_"
ist nicht wirklich ein regex)'_and_'
Muster zu variieren, können Sie die maximale Anzahl der Treffer (d.h. die zukünftigen Spalten) mitmax(lengths(strsplit(before$type, '_and_')))
Noch ein anderer Ansatz: Verwendung
rbind
aufout
:Und zu kombinieren:
strcapture("(.*)_and_(.*)", as.character(before$type), data.frame(type_1 = "", type_2 = ""))
Beachten Sie, dass sapply mit "[" kann verwendet werden, um zu extrahieren, die entweder in der ersten oder zweiten Elemente in diesen Listen, so:
Und hier ist eine gsub-Methode:
hier ist ein one-liner entlang der gleichen Linien wie aniko Lösung, aber mit hadley ' s stringr Paket:
stringr
Paket.Hinzufügen, um die Optionen, die Sie könnte auch mit meinem
splitstackshape::cSplit
Funktion wie diese:Eine einfache Möglichkeit ist die Verwendung
sapply()
und die[
Funktion:Beispiel:
sapply()
's Ergebnis ist eine matrix und benötigt zur Umsetzung und Gießen zurück, um einen Daten-frame. Es ist dann einige einfache Manipulationen, dass der Ertrag dem Ergebnis, das Sie wollte:Zu diesem Zeitpunkt
after
ist, was Sie wollteHier ist ein Basis-R ein-Passagierschiff, das überschneidet sich mit einer Reihe von früheren Lösungen, gibt aber ein Daten.Rahmen mit den entsprechenden Namen.
Es nutzt
strsplit
zu brechen, bis die variable, unddata.frame
mitdo.call
/rbind
zu setzen, die Daten wieder in eine Datenbank.frame. Der zusätzliche inkrementelle Verbesserung ist die Verwendung vonsetNames
zum hinzufügen von Variablen Daten.frame.Das Thema ist fast erschöpft, ich 'd, wie wenn eine Lösung anbieten, die zu einer etwas allgemeineren version, wo Sie nicht wissen, die Anzahl der Ausgabe-Spalten, a priori. So zum Beispiel haben Sie
Können wir nicht verwenden, dplyr
separate()
weil wir nicht wissen, die Anzahl der Ergebnisspalten vor dem split, so habe ich dann erstellt eine Funktion, die verwendetstringr
aufteilen einer Spalte, da das Muster und ein Präfix für die generierten Spalten. Ich hoffe, dass die Kodierung verwendeten Muster, sind zu korrigieren.Dann verwenden wir
split_into_multiple
im dplyr-Rohr wie folgt:Und dann können wir
gather
zum Aufräumen...Seit R version 3.4.0 können Sie
strcapture()
von der utils - Paket (enthalten in Basis-f-installiert), die Bindung der Ausgang auf die andere Spalte(N).Diese Frage ist ziemlich alt, aber ich ' ll fügen Sie die Lösung, die ich gefunden, die die einfachste zu präsentieren.
Anderen Ansatz, wenn Sie wollen stick mit
strsplit()
ist die Verwendung derunlist()
Befehl. Hier ist eine Lösung entlang dieser Linien.Basis, aber wahrscheinlich langsam: