00
:
00
:
00
:
00
•Corso SEO AI - Usa SEOEMAIL al checkout per il 30% di sconto

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.