如何通过do函数对某些列中不同数量的string进行分解

当列的元素具有不同数量的string时,我有分割列值的问题。 我可以用plyr做,例如:

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) 

因此,我们有与给定元素中的最大刺入次数相关的列数的dataframe。

当我尝试在dplyr中完成时,我使用了do函数:

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

但我得到一个错误:

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

在我看来,应该使用rbind函数,但我不知道在哪里。

你有麻烦,因为strsplit()返回一个列表,然后我们需要将as.data.frame.list()到每个元素,使其成为dplyr需要的正确格式。 即使如此,它仍然需要更多的工作来获得可用的结果。 长话短说,它似乎不是do()的合适的操作。

我想你可能会更好使用separate()tidyr 。 它可以很容易地用于dplyr函数和链。 目前还不清楚你是否想保留第一列,因为你的df2ldply结果没有,所以我把它关掉了。

 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 

你也可以使用cSplit 。 它也是非常有效的,因为它依赖于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 

或者更具体地说

 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