当列的元素具有不同的字符串数时,我遇到了拆分列值的问题.我可以在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)
但是我收到一个错误:
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
在我看来应该使用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)