2017-10-09 4 views
0

je la trame de données suivantes:Comment supprimer tout entre crochets pour chaque ligne dans une colonne à l'aide dplyr stringr


library(tidyverse) 
dat <- tribble(
    ~x, ~y, 
    1, "foo", 
    2, "bar (103 xxx)", 
    3, "bar", 
    4, "foo (yyy)" 
) 

dat 
#> # A tibble: 4 x 2 
#>  x    y 
#> <dbl>   <chr> 
#> 1  1   foo 
#> 2  2 bar (103 xxx) 
#> 3  3   bar 
#> 4  4  foo (yyy) 

Ce que je veux faire est de nettoyer la colonne y en supprimant toutes les chaînes contenues dans le support (). Ayant pour résultat:

 x    y 
    <dbl>   <chr> 
1  1   foo 
2  2   bar 
3  3   bar 
4  4   foo 

Comment puis-je faire?

J'ai essayé avec l'erreur:

> dat %>% stringr::str_replace(y, "\\([a-zA-Z0-9]+\\)","") 
Error in stringr::str_replace(., y, "\\([a-zA-Z0-9]+\\)", "") : 
    unused argument ("") 
+0

C'est juste une erreur de syntaxe. Avez-vous essayé de double échappement avec '' '\\' '' '? – CAustin

+0

@ CAustin J'ai essayé cela. Toujours erreur. – scamander

+0

Ok, mais c'est une erreur différente. Avez-vous essayé d'exploiter cette nouvelle information? – CAustin

Répondre

2

Le problème est le tuyau %>%, qui passe dat à str_replace comme premier argument, à savoir le dot dans le message d'erreur, ce qui est pas ce que str_replace attend:

> Error in stringr::str_replace(., y, "\\([a-zA-Z0-9]+\\)", "") : 
#       ^ dat passed here 

Vous pouvez utiliser str_replace avec mutate pour créer une nouvelle colonne:

dat %>% mutate(y = trimws(str_replace(y, "\\(.*?\\)", ""))) 

# A tibble: 4 x 2 
#  x  y 
# <dbl> <chr> 
#1  1 foo 
#2  2 bar 
#3  3 bar 
#4  4 foo 

Si vous souhaitez appliquer str_replace directement après la pipe, vous ne pouvez modifier une colonne/vecteur:

# here use pull to extract the column and manipulate it 
dat %>% pull(y) %>% str_replace("\\(.*?\\)", "") %>% trimws() 
# [1] "foo" "bar" "bar" "foo" 
1

Si l'on suppose que ce sont les modèles, une option base R serait

dat$y<- sub("\\s*\\(.*", "", dat$y) 
dat$y 
#[1] "foo" "bar" "bar" "foo" 
1

Vous pouvez également effectuer les opérations suivantes, ce qui évite de manipuler des crochets:

library(stringr) 
dat %>% 
    mutate(y = str_extract(y, "^\\w+")) 

mais je ne suis pas sûr si votre jeu de données réel est structuré comme ça.