如何通过do函数strsplit某些列中不同数量的字符串

时间:2014-12-01 21:39:37

标签: r plyr dplyr

当列的元素具有不同数量的字符串时,我遇到了拆分列值的问题。我可以在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)

因此,我们的数据框的列数与给定元素中的最大叮咬数有关。

当我尝试在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函数,但我不知道在哪里。

1 个答案:

答案 0 :(得分:17)

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

我认为您最好不要使用separate()中的tidyr。它可以很容易地与dplyr函数和链一起使用。目前尚不清楚您是否要保留第一列,因为ldply的{​​{1}}结果没有,所以我将其保留了。

df2

您也可以使用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