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