Замените символы, кроме определенных строк, на gsub - PullRequest
0 голосов
/ 09 мая 2018

Я пытаюсь заменить символы в столбце, которые не соответствуют шаблону в функции gsub.

столбец данных:

library(tidyverse)

df <- structure(list(partij_kort = c("COMBGB", "VVD", "GL", "NIEUWEL", 
"CDA")), .Names = "partij_kort", row.names = c(NA, -5L), class = c("tbl_df", 
"tbl", "data.frame"))

  partij_kort
  <chr>      
1 COMBGB     
2 VVD        
3 GL         
4 NIEUWEL    
5 CDA 

Этот код противоположен тому, что я хочу:

df %>% mutate(new = gsub("VVD|GL|CDA|CU|D66|PVDA|CUSGP|SGP|PVDAGL",
                         "something",
                         partij_kort))

  partij_kort new      
  <chr>       <chr>    
1 COMBGB      COMBGB   
2 VVD         something
3 GL          something
4 NIEUWEL     NIEUWEL  
5 CDA         something

Я хочу, чтобы каждая строка, которая не в этом шаблоне (COMBGB и NIEUWEL), изменилась в something.

Но восклицательный знак ! не работает с gsub (я часто использую его с grepl).

Желаемый результат:

  partij_kort new      
  <chr>       <chr>    
1 COMBGB      something
2 VVD         VVD      
3 GL          GL       
4 NIEUWEL     something
5 CDA         CDA 

Какой лучший способ сделать это?

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

Вам нужно использовать perl = TRUE в gsub и регулярное выражение, отменяющее ваш выбор.

library(tidyverse)

df <- structure(list(partij_kort = c("COMBGB", "VVD", "GL", "NIEUWEL", "CDA", "anything", "good" ,"bad","whtever")), 
                .Names = "partij_kort", 
                row.names = c(NA, -9L), 
                class = c("tbl_df", "tbl", "data.frame"))

df %>% mutate(new = gsub("^((?!(VVD|GL|CDA|CU|D66|PVDA|CUSGP|SGP|PVDAGL)).)*$",
                         "something", partij_kort, perl = TRUE))


# A tibble: 9 x 2
  partij_kort new      
  <chr>       <chr>    
1 COMBGB      something
2 VVD         VVD      
3 GL          GL       
4 NIEUWEL     something
5 CDA         CDA      
6 anything    something
7 good        something
8 bad         something
9 whtever     something

Спасибо

0 голосов
/ 09 мая 2018

Вы также можете использовать replace с grepl, как показано ниже:

library(tidyverse)
df %>% mutate(new = replace(partij_kort , !grepl("VVD|GL|CDA|CU|D66|PVDA|CUSGP|SGP|PVDAGL",
                         partij_kort),"something"))


# A tibble: 5 x 2
#  partij_kort       new
#        <chr>     <chr>
#1      COMBGB something
#2         VVD       VVD
#3          GL        GL
#4     NIEUWEL something
#5         CDA       CDA
0 голосов
/ 09 мая 2018

На самом деле, регулярное выражение не требуется, IMO:

library(dplyr)

exceptions <- c("VVD","GL","CDA","CU","D66","PVDA","CUSGP","SGP","PVDAGL")

df %>%
  mutate(new = if_else(!(partij_kort %in% exceptions), 
                       "something", 
                       partij_kort))

Это дает

# A tibble: 5 x 2
  partij_kort new      
  <chr>       <chr>    
1 COMBGB      something
2 VVD         VVD      
3 GL          GL       
4 NIEUWEL     something
5 CDA         CDA      
...