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.