mutate funcion filtros r dplyr

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?