Hinzufügen mehrerer Spalten in einem Dplyr-Mutate-Aufruf
Ich habe einen Datenrahmen mit einer durch Punkte getrennten Zeichenspalte:
> set.seed(310366)
> tst = data.frame(x=1:10,y=paste(sample(c("FOO","BAR","BAZ"),10,TRUE),".",sample(c("foo","bar","baz"),10,TRUE),sep=""))
> tst
x y
1 1 BAR.baz
2 2 FOO.foo
3 3 BAZ.baz
4 4 BAZ.foo
5 5 BAZ.bar
6 6 FOO.baz
7 7 BAR.bar
8 8 BAZ.baz
und ich möchte diese Spalte in zwei neue Spalten aufteilen, die die Teile auf beiden Seiten des Punktes enthalten.str_split_fixed
ab paketstringr
kann den Job ganz nett machen. Alle meine Werte bestehen definitiv aus zwei Teilen, die durch einen Punkt getrennt sind, damit ich Folgendes tun kann:
> require(stringr)
> str_split_fixed(tst$y,"\\.",2)
[,1] [,2]
[1,] "BAR" "baz"
[2,] "FOO" "foo"
[3,] "BAZ" "baz"
[4,] "BAZ" "foo"
[5,] "BAZ" "bar"
[6,] "FOO" "baz"
[7,] "BAR" "bar"
Jetzt konnte ich einfachcbind
das zu meinem Datenrahmen, aber ich dachte, ich würde herausfinden, wie man das in einem machtdplyr
Pipeline. Zuerst habe ich gedachtmutate
könnte es in einem tun:
> tst %.% mutate(parts=str_split_fixed(y,"\\.",2))
Error: wrong result size (20), expected 10 or 1
ich kann erhaltenmutate
Um es in zwei Schritten zu machen:
> tst %.% mutate(part1=str_split_fixed(y,"\\.",2)[,1], part2=str_split_fixed(y,"\\.",2)[,2])
x y part1 part2
1 1 BAR.baz BAR baz
2 2 FOO.foo FOO foo
3 3 BAZ.baz BAZ baz
4 4 BAZ.foo BAZ foo
5 5 BAZ.bar BAZ bar
6 6 FOO.baz FOO baz
aber so läuft die Zeichenfolge zweimal aufgeteilt.
"Bestes" kann ich bisher in einem tundplyr
So ist das (was ich erst beim Schreiben dieser Frage entdeckt habe ...):
> tst %.% do(cbind(.,data.frame(parts=str_split_fixed(.$y,"\\.",2))))
x y parts.1 parts.2
1 1 BAR.baz BAR baz
2 2 FOO.foo FOO foo
3 3 BAZ.baz BAZ baz
4 4 BAZ.foo BAZ foo
5 5 BAZ.bar BAZ bar
Das ist nicht schlecht, verliert aber viel von der Lesbarkeit von Pipe-Dingen in R. Gibt es einen einfachen Ansatz mitmutate
das habe ich verpasst?