Agregar múltiples columnas en una llamada dplyr mutate
Tengo un marco de datos con una columna de caracteres separados por puntos:
> 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
y quiero dividir esa columna en dos columnas nuevas que contengan las partes a cada lado del punto.str_split_fixed
del paquetestringr
puede hacer el trabajo bastante bien. Todos mis valores son definitivamente dos partes separadas por un punto, así que puedo hacer:
> 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"
Ahora solo podríacbind
eso a mi marco de datos, pero pensé que averiguaría cómo hacerlo en undplyr
tubería. Primero pensémutate
podría hacerlo en uno:
> tst %.% mutate(parts=str_split_fixed(y,"\\.",2))
Error: wrong result size (20), expected 10 or 1
puedo conseguirmutate
hacerlo en dos:
> 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
pero eso ejecuta la cadena dividida dos veces.
"Lo mejor" que puedo hacer hasta ahora en undplyr
de esta manera (que solo descubrí al escribir esta pregunta ...):
> 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
lo cual no está mal, pero pierde mucha de la legibilidad de las cosas canalizadas en R. ¿Existe un enfoque simple usandomutate
que me he perdido?