2015-11-27 22 views
7

Ho una variabile stringa contenente alfabeto [a-z], spazio [] e apostrofo ['], ad es. x <- "a'b c" Voglio sostituire apostrofo ['] con vuoto [], e sostituire lo spazio [] con il carattere di sottolineatura [_].Sostituisci più stringhe in una istruzione gsub() o chartr() in R?

x <- gsub("'", "", x) 
x <- gsub(" ", "_", x) 

Funziona in modo assoluto, ma quando ho molte condizioni, il codice diventa brutto. Pertanto, voglio utilizzare chartr(), ma chartr() non può occuparsi di vuoto, ad es.

x <- chartr("' ", "_", x) 
#Error in chartr("' ", "_", "a'b c") : 'old' is longer than 'new' 

C'è un modo per risolvere questo problema? Grazie!

+1

L'hai già risolto con i due gsub. Se sembra troppo brutto, puoi creare la tua funzione di wrapper che è "più carina", suppongo. Ma non puoi usare 'chartr' perché" vuoto "non è un personaggio, è la mancanza di un personaggio. – MrFlick

risposta

5

È possibile utilizzare gsubfn

library(gsubfn) 
gsubfn(".", list("'" = "", " " = "_"), x) 
# [1] "ab_c" 
9

Io sono un fan della sintassi che le %<>% e %>% opperators dal pacchetto magrittr forniscono.

library(magrittr) 

x <- "a'b c" 

x %<>% 
    gsub("'", "", .) %>% 
    gsub(" ", "_", .) 
x 
##[1] "ab_c" 

gusbfn è meraviglioso, ma mi piace il concatenamento %>% permette.

+1

qual è il significato del terzo argomento "." in gsub() – Ali

+2

Per impostazione predefinita, l'oggetto sul lato sinistro di '%>%' è * convogliato * al primo argomento sul lato destro. Se il LHS deve essere, come in questo esempio, il terzo argomento, il '.' è il segnaposto. Vedi 'vignette (" magrittr ")' per maggiori dettagli. – Peter

0
gsub("\\s", "", chartr("' ", " _", x)) # Use whitespace and then remove it 
0

opterei per un magrittr e/o dplyr soluzione, pure. Tuttavia, preferisco non creare una nuova copia dell'oggetto, specialmente se è in una funzione e può essere restituito a buon mercato.

cioè

return(
    catInTheHat %>% gsub('Thing1', 'Thing2', .) %>% gsub('Red Fish', 'Blue 
    Fish', .) 
) 

... e così via.