2014-12-01 47 views
12

當列的元素具有不同數量的字符串時,我在拆分列值時出現問題。我能做到這一點的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功能,但我不知道在哪裏。

回答

16

由於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 

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

好非常感謝。但是如果我們不知道列的給定元素中有多少個字符串呢? – Nicolabo 2014-12-01 22:55:41

+1

如果你不知道有多少列,那麼我會使用'cSplit',因爲它確實對你有用。順便問一下,第一個問題很好。清楚地問及可重複性。 +1 – 2014-12-01 22:58:55

+1

@Nicolabo,你可以先使用'stringr :: str_count'來確定最大值。沒有你需要的列,然後使用'tidyr :: separate'。像這樣 - 'LEN = MAX(str_count(字符串= DF $名稱,圖案= 「 」));' 'vec_names = paste0(「 X」,1:(LEN + 1));' '獨立(df [-1],name,vec_names,「」,extra =「merge」);' – steadyfish 2015-09-27 18:20:50

相關問題