2017-08-15 134 views
1

我有一列全名,应该按照空格分成三列。问题是一些全名包含三个以上的单词,第四和其他单词不应该被忽略,但是会被添加到第三部分。
例如,"Abdullaeva Mehseti Nuraddin Kyzy"应分开为:将列分隔为三列,分组编号为

| Abdullaeva | Mehseti | Nuraddin Kyzy | 

我试图分裂与(tidyr)包作为跟随列,但在本方式的3D部分只包含1后第二空间字。

df<-df %>% 
    separate('FULL_NAME', c("1st_part","2d_part","3d_part"), sep=" ") 

任何帮助将不胜感激。

+0

请提供可重复的例子 – Sotos

+0

你始终'名1名2 FNAME lname',你想'| name1 | name2 | fname lname |'? –

+0

@ shA.t,几乎在大多数情况下,是的,但我想这是可能的情况,我应该以其他方式对名称进行分组:'| name1 | name2 name3 | lname |'为另一个数据集(不在这一个) –

回答

2

使用extra说法:

# dummy data 
df1 <- data.frame(x = c(
    "some name1", 
    "justOneName", 
    "some three name", 
    "Abdullaeva Mehseti Nuraddin Kyzy")) 

library(tidyr) 
library(dplyr) 

df1 %>% 
    separate(x, c("a1", "a2", "a3"), extra = "merge") 
#   a1  a2   a3 
# 1  some name1   <NA> 
# 2 justOneName <NA>   <NA> 
# 3  some three   name 
# 4 Abdullaeva Mehseti Nuraddin Kyzy 
# Warning message: 
# Too few values at 2 locations: 1, 2 

从手册:

额外

如果SEP是一个特征向量,该控制的时候 有太多的作品会发生什么。有三种有效选项:
- “警告”(默认值):发出警告并删除额外的值。
- “drop”:在没有警告的情况下删除任何额外的值。
- “合并”:只拆分最多长度(进)次

+0

什么是额外=合并业务? – Sotos

+1

@Sotos黑魔法:D – zx8754

+0

Hihi ...可以追溯到黑暗时代:)虽然不错的争论。合并所有其余的列。我想知道这是否可以用来解决未知数量的cols(有点像cSplit) – Sotos

2

由于该数据集,你说,你只有name1, name2, last name,那么你也可以使用来自stringrstr_split_fixed,即

setNames(data.frame(stringr::str_split_fixed(df1$x, ' ', 3)), paste0('a', 1:3)) 

其中给出,

 a1  a2   a3 
1  some name1    
2 justOneName      
3  some three   name 
4 Abdullaeva Mehseti Nuraddin Kyzy 

注意,你可以填补NA空槽按通常