funcion - filtros en r
Adición de múltiples columnas en una llamada mutada dplyr (1)
Puede usar la función separate()
de tidyr
en combinación con dplyr
:
tst %>% separate(y, c("y1", "y2"), sep = "//.", remove=FALSE)
x y y1 y2
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
7 7 BAR.bar BAR bar
8 8 BAZ.baz BAZ baz
9 9 FOO.bar FOO bar
10 10 BAR.foo BAR foo
El ajuste remove=TRUE
eliminará la columna y
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 nuevas columnas que contienen las partes a cada lado del punto. str_split_fixed
from package stringr
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 cbind
con mi marco de datos, pero pensé que me gustaría averiguar cómo hacerlo en una tubería dplyr
. Primero pensé que mutate
podía hacerlo en uno:
> tst %.% mutate(parts=str_split_fixed(y,"//.",2))
Error: wrong result size (20), expected 10 or 1
Puedo obtener mutate
para 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 es correr la cadena dividida dos veces.
"Lo mejor" que puedo hacer hasta ahora de una dplyr
sencilla es esto (que solo descubrí mientras escribía 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 es malo, pero pierde mucho de la legibilidad de las cosas entubadas en R. ¿Hay un enfoque simple utilizando el mutate
que me he perdido?