Come eseguire lo smistamento di un numero diverso di stringhe in determinate colonne mediante la funzione do

Ho un problema con il valore della colonna divisa quando l’elemento della colonna ha un numero diverso di stringhe. Posso farlo in plyr ad esempio:

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) 

Di conseguenza, abbiamo una cornice dati con numero di colonne correlate al numero massimo di punture in un dato elemento.

Quando provo a farlo in dplyr, ho usato la funzione do :

 library(dplyr) df2 % do(data.frame(strsplit(.$name, " "))) 

ma ottengo un errore:

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

Mi sembra che dovrebbe essere usato rbind function ma non so dove.

Stai avendo problemi perché strsplit() restituisce una lista che dobbiamo quindi applicare as.data.frame.list() a ciascun elemento per ottenere il formato corretto richiesto da dplyr . Anche allora richiederebbe ancora un po ‘di lavoro per ottenere risultati utilizzabili. Per farla breve, non sembra un’operazione adatta per do() .

Penso che potresti stare meglio usando separate() da tidyr . Può essere facilmente utilizzato con dplyr funzioni e le catene di dplyr . Non è chiaro se si desidera mantenere la prima colonna dal momento che il risultato ldply per df2 non ce l’ha, quindi l’ho lasciato.

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

Puoi anche usare cSplit . È anche molto efficiente poiché si basa su 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 più nello specifico

 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