将列分为三列,分组为

时间:2017-08-15 10:36:44

标签: r regex split

我有一个全名列,应该用空格分成三列。问题是一些全名包含三个以上的单词,第四个和其他单词不应该省略,而是添加到第三部分。
例如,"Abdullaeva Mehseti Nuraddin Kyzy"应分隔为:

| Abdullaeva | Mehseti | Nuraddin Kyzy | 

我尝试用(tidyr)包拆分列,如下所示,但这样3d部分在第二个空格后只包含1个单词。

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

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分: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是一个字符向量,它控制着什么时候发生的事情   有太多的碎片。有三个有效选项:
   - &#34;警告&#34; (默认值):发出警告并删除额外值    - &#34;掉落&#34;:在没有警告的情况下丢弃任何额外的值    - &#34;合并&#34;:只分裂最长(进)次

答案 1 :(得分:2)

因为您说这个数据集只有name1, name2, last name,所以您也可以使用str_split_fixed中的stringr,即

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填充空位