Manipolazione Stringhe in R
La manipolazione delle stringhe e un’operazione fondamentale in qualsiasi linguaggio di programmazione. R offre un insieme completo di funzioni per creare, combinare, cercare e trasformare testo, sia tramite funzioni base sia attraverso il pacchetto stringr del tidyverse.
Concatenare Stringhe: paste() e paste0()
Le funzioni paste() e paste0() sono il modo principale per unire stringhe in R.
# paste() unisce stringhe con un separatore (default: spazio)
nome <- "Mario"
cognome <- "Rossi"
paste(nome, cognome)
# [1] "Mario Rossi"
# Specificare un separatore personalizzato
paste(nome, cognome, sep = "-")
# [1] "Mario-Rossi"
# paste0() unisce senza separatore
paste0("utente_", 1:5)
# [1] "utente_1" "utente_2" "utente_3" "utente_4" "utente_5"
# Usare collapse per unire un vettore in una singola stringa
frutti <- c("mela", "pera", "banana")
paste(frutti, collapse = ", ")
# [1] "mela, pera, banana"
# Combinare paste con collapse
paste0("Item_", 1:3, collapse = " | ")
# [1] "Item_1 | Item_2 | Item_3"
Lunghezza e Sottostringhe: nchar() e substr()
# Contare i caratteri di una stringa
frase <- "Ciao mondo"
nchar(frase)
# [1] 10
# nchar() funziona anche su vettori
parole <- c("R", "Python", "JavaScript")
nchar(parole)
# [1] 1 6 10
# Estrarre una sottostringa con substr()
testo <- "Programmazione in R"
substr(testo, 1, 15)
# [1] "Programmazione "
# Estrarre gli ultimi 3 caratteri
substr(testo, nchar(testo) - 2, nchar(testo))
# [1] "n R"
# Sostituire una parte della stringa con substr()
codice <- "ABC-000"
substr(codice, 5, 7) <- "123"
print(codice)
# [1] "ABC-123"
Maiuscole e Minuscole: toupper() e tolower()
# Convertire in maiuscolo
toupper("ciao mondo")
# [1] "CIAO MONDO"
# Convertire in minuscolo
tolower("CIAO MONDO")
# [1] "ciao mondo"
# Capitalizzare la prima lettera (non esiste una funzione base diretta)
capitalizza <- function(x) {
paste0(toupper(substr(x, 1, 1)), tolower(substr(x, 2, nchar(x))))
}
capitalizza("programmazione")
# [1] "Programmazione"
# Applicare a un vettore
sapply(c("mario", "LUCA", "aNnA"), capitalizza)
# [1] "Mario" "Luca" "Anna"
Sostituzione: gsub() e sub()
sub() sostituisce solo la prima occorrenza di un pattern, mentre gsub() sostituisce tutte le occorrenze.
# sub(): sostituisce la prima occorrenza
testo <- "la mela e rossa, la mela e dolce"
sub("mela", "pera", testo)
# [1] "la pera e rossa, la mela e dolce"
# gsub(): sostituisce tutte le occorrenze
gsub("mela", "pera", testo)
# [1] "la pera e rossa, la pera e dolce"
# Rimuovere spazi extra
testo_sporco <- " troppi spazi qui "
gsub("\\s+", " ", trimws(testo_sporco))
# [1] "troppi spazi qui"
# Rimuovere caratteri non alfanumerici
gsub("[^a-zA-Z0-9 ]", "", "Prezzo: 19.99! (sconto)")
# [1] "Prezzo 1999 sconto"
# Usare espressioni regolari
email <- "utente@esempio.com"
sub("@.*", "", email) # Estrarre la parte prima della @
# [1] "utente"
Ricerca nei Testi: grep() e grepl()
grep() restituisce gli indici o i valori corrispondenti, mentre grepl() restituisce un vettore logico.
# Vettore di esempio
citta <- c("Milano", "Roma", "Napoli", "Palermo", "Firenze", "Modena")
# grep(): restituisce gli indici delle corrispondenze
grep("Mo", citta)
# [1] 6
# grep() con value = TRUE restituisce i valori
grep("^M", citta, value = TRUE)
# [1] "Milano" "Modena"
# grepl(): restituisce TRUE/FALSE per ogni elemento
grepl("a$", citta) # Citta che finiscono con "a"
# [1] FALSE TRUE FALSE FALSE FALSE TRUE
# Filtrare un data frame con grepl()
dati <- data.frame(
nome = c("Mario Rossi", "Anna Verdi", "Marco Bianchi"),
eta = c(30, 25, 35)
)
dati[grepl("Mar", dati$nome), ]
# nome eta
# 1 Mario Rossi 30
# 3 Marco Bianchi 35
# Ricerca case-insensitive
grep("milano", citta, ignore.case = TRUE)
# [1] 1
Dividere Stringhe: strsplit()
strsplit() divide una stringa in parti in base a un separatore e restituisce una lista.
# Dividere una stringa
frase <- "R e un linguaggio potente"
strsplit(frase, " ")
# [[1]]
# [1] "R" "e" "un" "linguaggio" "potente"
# Estrarre il risultato come vettore
parole <- strsplit(frase, " ")[[1]]
length(parole)
# [1] 5
# Dividere un percorso file
percorso <- "C:/Users/utente/documenti/file.csv"
strsplit(percorso, "/")[[1]]
# [1] "C:" "Users" "utente" "documenti" "file.csv"
# Dividere piu stringhe
csv_righe <- c("Mario,30,Milano", "Anna,25,Roma")
lapply(csv_righe, function(x) strsplit(x, ",")[[1]])
# [[1]]
# [1] "Mario" "30" "Milano"
# [[2]]
# [1] "Anna" "25" "Roma"
Formattazione con sprintf()
sprintf() formatta le stringhe utilizzando segnaposto, in modo simile al linguaggio C.
# Segnaposto per stringhe (%s) e numeri (%d, %f)
nome <- "Mario"
eta <- 30
sprintf("Mi chiamo %s e ho %d anni.", nome, eta)
# [1] "Mi chiamo Mario e ho 30 anni."
# Formattare numeri decimali
prezzo <- 19.99
sprintf("Il prezzo e: %.2f euro", prezzo)
# [1] "Il prezzo e: 19.99 euro"
# Padding con zeri
sprintf("Ordine n. %05d", 42)
# [1] "Ordine n. 00042"
# Applicare a vettori
sprintf("Prodotto %d: %s (%.1f euro)", 1:3, c("Mela", "Pera", "Banana"), c(1.5, 2.0, 1.2))
# [1] "Prodotto 1: Mela (1.5 euro)"
# [2] "Prodotto 2: Pera (2.0 euro)"
# [3] "Prodotto 3: Banana (1.2 euro)"
Il Pacchetto stringr
Il pacchetto stringr, parte del tidyverse, offre funzioni con nomi coerenti e una sintassi piu intuitiva. Tutte le funzioni iniziano con il prefisso str_.
# Installare e caricare stringr
install.packages("stringr")
library(stringr)
str_detect() - Verificare la Presenza di un Pattern
frutti <- c("mela rossa", "pera verde", "banana gialla", "mela verde")
# Verificare se un pattern e presente
str_detect(frutti, "mela")
# [1] TRUE FALSE FALSE TRUE
# Filtrare con str_detect
frutti[str_detect(frutti, "verde")]
# [1] "pera verde" "mela verde"
str_replace() e str_replace_all()
# Sostituire la prima occorrenza
str_replace("la mela e buona, la mela e rossa", "mela", "pera")
# [1] "la pera e buona, la mela e rossa"
# Sostituire tutte le occorrenze
str_replace_all("la mela e buona, la mela e rossa", "mela", "pera")
# [1] "la pera e buona, la pera e rossa"
# Sostituzioni multiple
str_replace_all("uno due tre", c("uno" = "1", "due" = "2", "tre" = "3"))
# [1] "1 2 3"
str_extract() e str_extract_all()
# Estrarre la prima corrispondenza
testi <- c("Tel: 06-1234567", "Cell: 333-9876543", "Nessun numero")
str_extract(testi, "\\d+-\\d+")
# [1] "06-1234567" "333-9876543" NA
# Estrarre tutte le corrispondenze
testo <- "Ho 3 gatti e 2 cani"
str_extract_all(testo, "\\d+")
# [[1]]
# [1] "3" "2"
Altre Funzioni Utili di stringr
# Rimuovere spazi bianchi
str_trim(" ciao mondo ")
# [1] "ciao mondo"
# Padding
str_pad("42", width = 6, pad = "0")
# [1] "000042"
# Troncare una stringa
str_trunc("Questo e un testo molto lungo", width = 20)
# [1] "Questo e un test..."
# Contare le occorrenze
str_count("abracadabra", "a")
# [1] 5
Conclusione
R offre strumenti completi per la manipolazione delle stringhe, sia attraverso le funzioni base (paste, gsub, grep, sprintf) sia tramite il pacchetto stringr. Le funzioni base sono sempre disponibili e adatte per operazioni semplici, mentre stringr fornisce una sintassi coerente e leggibile particolarmente apprezzata nei flussi di lavoro del tidyverse. La scelta tra i due approcci dipende dalle preferenze personali e dal contesto del progetto.