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

Nic*_*abo 12 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)
Run Code Online (Sandbox Code Playgroud)

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

当我尝试在dplyr中执行此操作时,我使用了do函数:

library(dplyr)
df2 <- df %>%
  do(data.frame(strsplit(.$name, " ")))
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

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

在我看来应该使用rbind功能,但我不知道在哪里.

Ric*_*ven 17

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

我想你可能会更好使用 separate()tidyr.它可以很容易地与dplyr函数和链一起使用.目前尚不清楚你是否想要保留第一列,因为你的ldply结果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
Run Code Online (Sandbox Code Playgroud)

你也可以用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
Run Code Online (Sandbox Code Playgroud)

或者更具体地说

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
Run Code Online (Sandbox Code Playgroud)