RegEx模式分隔符到拆分列不起作用

时间:2018-04-16 21:48:54

标签: r regex tidyr separator

我正在尝试将我的正则表达式模式用于我希望使用separator()包中的tidyr函数拆分的列。但是我无法弄清楚为什么我的模式不起作用。

这是我的输入数据帧: 列gemeente表示英语中的“市政”,partijen表示“政党”。

      gemeente                                                      partijen
1        Asten                 CDA 1 , Algemeen Belang 1 en Leefbaar Asten 1
2         Beek                                              BBB-NDB 2, CDA 2
3    Coevorden                                     PvdA 1, CDA 1 en Lokaal 1
4       Ermelo Progressief Ermelo 1, BurgerBelangen Ermelo 1, SGP 1 en VVD 1
5 Heeze-Leende                Lokaal  Heeze-Leende 1, CDA 1, D66 1 en PvdA 1
6        Hulst   Algemeen Belang Groot Hulst 1,5, CDA 1, PvdA 0,7 en VVD 0,8
7    Roerdalen          RoerstreekLokaal! 1, CDA 1 en Democraten Roerdalen 1
8         Uden    Jong Uden 1, CDA 1 , Gewoon Uden 1 en VVD-Leefbaar Uden 1  

一个号码之前或之间的所有内容都是荷兰的当地政党。我希望让每个派对都在自己的专栏中,然后转置整理我的数据框。 en这个词在荷兰语中的意思是'和',所以我们也可以删除那个。

这是同一数据框的dput()输出:

df <- structure(list(gemeente = c("Asten", "Beek", "Coevorden", "Ermelo", 
"Heeze-Leende", "Hulst", "Roerdalen", "Uden"), partijen = c("CDA 1 , Algemeen Belang 1 en Leefbaar Asten 1", 
"BBB-NDB 2, CDA 2", "PvdA 1, CDA 1 en Lokaal 1", "Progressief Ermelo 1, BurgerBelangen Ermelo 1, SGP 1 en VVD 1", 
"Lokaal  Heeze-Leende 1, CDA 1, D66 1 en PvdA 1", "Algemeen Belang Groot Hulst 1,5, CDA 1, PvdA 0,7 en VVD 0,8", 
"RoerstreekLokaal! 1, CDA 1 en Democraten Roerdalen 1", "Jong Uden 1, CDA 1 , Gewoon Uden 1 en VVD-Leefbaar Uden 1 "
)), row.names = c(NA, -8L), class = c("tbl_df", "tbl", "data.frame"
), .Names = c("gemeente", "partijen"))

...低于我的代码,但几乎没有完全正常工作。 首先,我删除了数字(我不使用空格或逗号,因为有一个名为D66的聚会),然后我separate进入多个列,其中包含两个分隔符sep = ", |,| , | en "

library(tidyverse)

df %>%
  mutate(partijen = gsub(" [0-9]|\\,[0-9]", "", partijen)) %>%
  separate(partijen, 
           into = c("partij_1", "partij_2", "partij_3", "partij_4"),
           sep = ", |,| , | en ")

我的输出运行如下:

# A tibble: 8 x 5
  gemeente     partij_1                    partij_2                          partij_3                          partij_4
  <chr>        <chr>                       <chr>                             <chr>                             <chr>   
1 Asten        CDA                         Algemeen Belang en Leefbaar Asten NA                                NA      
2 Beek         BBB-NDB                     CDA                               NA                                NA      
3 Coevorden    PvdA                        CDA                               Lokaal                            NA      
4 Ermelo       Progressief Ermelo          BurgerBelangen Ermelo             SGP en VVD                        NA      
5 Heeze-Leende Lokaal  Heeze-Leende        CDA                               D66                               PvdA    
6 Hulst        Algemeen Belang Groot Hulst CDA                               PvdA                              VVD     
7 Roerdalen    RoerstreekLokaal!           CDA en Democraten Roerdalen       NA                                NA      
8 Uden         Jong Uden                   CDA                               Gewoon Uden en VVD-Leefbaar Uden  NA   
Warning message:
Expected 4 pieces. Missing pieces filled with `NA` in 6 rows [1, 2, 3, 4, 7, 8].

你看到我的问题了吗?

我不明白为什么sep = ", |,| , | en "不适用于双方之间的en

  • "Algemeen Belang en Leefbaar Asten"
  • "SGP en VVD"
  • CDA en Democraten Roerdalen"
  • 等...

1 个答案:

答案 0 :(得分:1)

当我在"[[:space:]]en[[:space:]]"函数的" en "参数中使用此模式sep =而不是separator时,它会正确分割。

所以适用的代码(对我而言)如下:

library(tidyverse)

df %>%
  mutate(partijen = gsub(" [0-9]|\\,[0-9]", "", partijen)) %>%
  separate(partijen, 
           into = c("partij_1", "partij_2", "partij_3", "partij_4"),
           sep = ", |,| , |[[:space:]]en[[:space:]]")