r plyr dplyr

Cómo dividir diferentes números de cadenas en cierta columna por función do



plyr dplyr (1)

Tiene problemas porque strsplit() devuelve una lista que luego debemos aplicar as.data.frame.list() a cada elemento para obtener el formato adecuado que requiere dplyr . Incluso entonces, aún requeriría un poco más de trabajo para obtener resultados utilizables. En pocas palabras, no parece una operación adecuada para do() .

Creo que podría ser mejor usar separate() de tidyr . Se puede usar fácilmente con funciones y cadenas dplyr . No está claro si desea mantener la primera columna ya que su resultado de ldply para df2 no lo tiene, así que lo dejé.

library(tidyr) separate(df[-1], name, 1:3, " ", extra = "merge") # 1 2 3 # 1 jake <NA> <NA> # 2 jane jane <NA> # 3 john john john

También cSplit usar cSplit . También es muy eficiente ya que se basa en data.table

library(splitstackshape) cSplit(df[-1], "name", " ") # name_1 name_2 name_3 # 1: jake NA NA # 2: jane jane NA # 3: john john john

O más específicamente

setnames(df2 <- cSplit(df[-1], "name", " "), names(df2), as.character(1:3)) df2 # 1 2 3 # 1: jake NA NA # 2: jane jane NA # 3: john john john

Tengo un problema con el valor de la columna dividida cuando el elemento de la columna tiene un número diferente de cadenas. Puedo hacerlo en plyr, por ejemplo:

library(plyr) column <- c("jake", "jane jane","john john john") df <- data.frame(1:3, name = column) df$name <- as.character(df$name) df2 <- ldply(strsplit(df$name, " "), rbind) View(df2)

Como resultado, tenemos un marco de datos con el número de columnas relacionadas con el número máximo de picaduras en un elemento dado.

Cuando trato de hacerlo en dplyr, solía do función:

library(dplyr) df2 <- df %>% do(data.frame(strsplit(.$name, " ")))

pero me sale un error:

Error in data.frame("jake", c("jane", "jane"), c("john", "john", "john" : arguments imply differing number of rows: 1, 2, 3

Me parece que debería usarse la función rbind , pero no sé dónde.