Wie man unterschiedliche Anzahl der Zeichenketten in bestimmter Spalte durch Do-function strsplit

Ich habe ein Problem mit Split-Spalte Wert, wenn Element der Spalte eine andere Anzahl von Strings hat. Ich kann es in plyr machen, zB:

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) 

Als Ergebnis haben wir einen Datenrahmen mit einer Anzahl von Spalten, die sich auf die maximale Anzahl von Stichen in einem gegebenen Element beziehen.

Wenn ich es in dplyr versuche, benutze ich do function:

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

aber ich bekomme einen Fehler:

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

Es scheint mir, dass es rbind function verwendet werden rbind , aber ich weiß nicht wo.

Sie haben Probleme, da strsplit() eine Liste zurückgibt, die wir dann auf jedes Element as.data.frame.list() anwenden as.data.frame.list() , um es in das richtige Format zu bringen, das dplyr benötigt. Selbst dann würde es noch etwas mehr Arbeit erfordern, um brauchbare Ergebnisse zu erhalten. Lange Rede, kurzer Sinn, es scheint keine geeignete Operation für do() .

Ich denke, dass es besser wäre, separate() von tidyr . Es kann leicht mit dplyr functionen und Ketten verwendet werden. Es ist nicht klar, ob du die erste Spalte behalten willst, weil dein ldply Ergebnis für df2 es nicht hat, also habe ich es df2 .

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

Sie könnten auch cSplit . Es ist auch sehr effizient, da es auf data.table beruht

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

Oder genauer gesagt

 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