2015-11-20 60 views
0

這是一個簡單的測試用例。數據框中的R字符串拆分操作不起作用

正打算分割並提取每個字符串的第一部分。

library(dplyr) 
library(stringr) 
test = data.frame(x= c('a b', 'c d'),stringsAsFactors = F) 

test 
    x 
1 a b 
2 c d 

test %>% mutate(y = str_split(x,'\\s+')[[1]][1]) 
    x y 
1 a b a 
2 c d a 

期待這樣的:

x y 
1 a b a 
2 c d c 
+0

的'str_split'是'list'輸出,讓你的索引是錯誤的。 – A5C1D2H2I1M1N2O1R2T1

+1

@你應該使用阿蘭達圖書館:'library(splitstackshape); cSplit(test,'x','')' –

+0

@ColonelBeauvel我同意,但是它是「阿南達」:) – Frank

回答

3

現在有一個分裂列成碎片各種打包的功能。在這裏您可以使用tidyr包中的separate()功能。既然你想要在空間上的第一個分割值,你可以刪除第一個空格後的所有東西。

tidyr::separate(test, x, "y", "\\s.*", FALSE, extra = "drop") 
#  x y 
# 1 a b a 
# 2 c d c 
+2

孩子們現在都喜歡獨立'功能。回到我的那一天,我不得不用手去滑雪,在雪地四英里處......抱怨發牢騷。 – thelatemail

+0

上山,兩種方式?那些討厭的包裝流氓。 –

2

str_split返回一個列表,其中每個元素對應於原始原子向量中的元素。因此,你需要使用lapply或類似指標適當

test %>% mutate(y = unlist(lapply(str_split(x,'\\s+'),'[[',1))) 
+0

'test%>%mutate(y = vapply(strsplit(x,「\\ s +」),\'[\',1,FUN.VALUE = character(1)))'''vapply' ftw。 – thelatemail

2

我們也可以使用sub

library(data.table) 
setDT(test)[, y:= sub('\\s+.*', '', x)] 
test 
#  x y 
#1: a b a 
#2: c d c