Menu

Stringhe in R: paste, sprintf, gsub, substr e altro

Tutto quello che ti serve per il testo in R: creare stringhe, unirle con paste e paste0, formattarle con sprintf e cercare con gsub, grepl e strsplit.

Questa pagina include editor eseguibili: modifica, esegui e vedi subito l'output.

Creare stringhe in R

Una stringa in R è del testo tra virgolette. Virgolette doppie e singole funzionano entrambe e significano esattamente la stessa cosa; la convenzione è usare le doppie, e passare alle singole quando il testo stesso contiene una virgoletta doppia:

Le sequenze di escape con la barra rovesciata funzionano come nella maggior parte dei linguaggi: \" per una virgoletta letterale, \n per andare a capo, \t per una tabulazione, \\ per la barra rovesciata stessa.

Ora l'errore che ogni principiante di R fa esattamente una volta: chiedere a una stringa quanto è lunga con length().

nchar() conta i caratteri: 5. length() conta gli elementi del vettore, e una singola stringa è un vettore di un elemento, quindi dice 1. In R tutto è un vettore, testo compreso, e tutte le funzioni di questa pagina lavorano in silenzio elemento per elemento su interi vettori di caratteri. È una funzionalità utile, una volta che smetti di stupirtene.

Unire stringhe: paste() e paste0()

R non ha il + per le stringhe. La concatenazione si fa con paste(), che di default unisce i suoi argomenti con uno spazio, e con paste0(), che li unisce senza niente in mezzo:

Dato che paste è vettorizzata, se le passi un vettore costruisce molte stringhe in una volta: è così che generi nomi di file, etichette e ID in una sola riga:

E l'argomento collapse fa il contrario: fonde un intero vettore in un'unica stringa con il separatore che scegli:

Ricorda la distinzione: sep controlla la colla tra gli argomenti, collapse la colla tra gli elementi di un vettore. Puoi usarli entrambi nella stessa chiamata.

Formattare con sprintf()

Quando ti servono numeri formattati dentro un testo, con un numero fisso di decimali o una larghezza fissa, paste() non basta più e subentra sprintf(). Usa codici di formato in stile C: %s per le stringhe, %d per i numeri interi, %f per i decimali:

%.1f significa "un decimale", %.3f tre, e %05d riempie fino a cinque cifre con degli zeri. Un %% doppio produce un segno di percentuale letterale. Anche sprintf() è vettorizzata, quindi può formattare un'intera colonna di valori con una sola chiamata: vedi input e output per lo schema di report con sprintf() + cat().

Maiuscole, minuscole ed estrazione: toupper(), tolower(), substr()

La conversione tra maiuscole e minuscole fa esattamente quello che dice:

tolower() si guadagna il posto normalizzando i dati disordinati prima di un confronto: "Yes", "YES" e "yes" diventano tutti lo stesso valore.

substr(x, start, stop) estrae una porzione in base alla posizione dei caratteri, contando da 1 (R parte da 1 ovunque):

Entrambi gli estremi sono inclusi: le posizioni da 1 a 11 danno "Programming".

Cercare e sostituire: sub(), gsub() e grepl()

sub() sostituisce la prima occorrenza di un pattern; gsub() ("global substitute") le sostituisce tutte:

Un dettaglio cruciale: di default il pattern è un'espressione regolare, non testo letterale. I caratteri delle regex come ., *, ( e ? hanno significati speciali: un . da solo corrisponde a qualsiasi carattere. Quando intendi il testo letterale, passa fixed = TRUE:

La prima riga dà a-b-c; la seconda dà -----, perché come regex . ha trovato ogni singolo carattere. Finché non hai imparato le regex, usa fixed = TRUE come default e non avrai brutte sorprese.

grepl() non sostituisce: verifica se ogni elemento corrisponde e restituisce un vettore logico. Per questo è lo strumento standard per filtrare il testo:

Il primo risultato indica quali nomi di file contengono .csv; il secondo usa quel vettore logico per tenere solo le corrispondenze.

Dividere e ripulire: strsplit() e trimws()

strsplit() spezza una stringa in base a un separatore. La sua unica stranezza: restituisce una lista, perché può dividere molte stringhe insieme. Per una sola stringa, prendi il primo elemento con [[1]]:

E trimws() toglie gli spazi in cui i dati reali arrivano sempre avvolti:

Di default ripulisce entrambe le estremità; which = "left" o "right" ne ripulisce solo una (i nomi si riferiscono all'inizio e alla fine della stringa).

L'alternativa stringr

Tutto quello che hai visto finora è R base: sempre disponibile, nessuna installazione. Il pacchetto stringr del tidyverse racchiude le stesse operazioni in uno schema di nomi coerente, str_*, con la stringa sempre come primo argomento, che molti trovano più facile da ricordare (vedi pacchetti per installarlo):

library(stringr)

str_detect(files, "csv")            # like grepl(), data first
str_replace_all(s, "good", "great") # like gsub(), arguments reordered
str_length("hello")                 # like nchar()

Vale comunque la pena conoscere le funzioni di base per le stringhe: le incontrerai in ogni script, in ogni risposta su Stack Overflow e in ogni messaggio di errore. Impara prima i nomi di base; passa a stringr quando l'ordine incoerente degli argomenti inizia a infastidirti.

Cosa ti porti a casa

  • Per convenzione le stringhe usano le virgolette doppie; nchar() conta i caratteri, length() conta gli elementi del vettore.
  • Concatena con paste() / paste0(); sep incolla gli argomenti, collapse incolla un vettore in una sola stringa.
  • sprintf() gestisce l'output formattato: %s, %d, %.2f.
  • sub() sostituisce la prima corrispondenza, gsub() tutte, grepl() verifica se ci sono corrispondenze; di default usano tutte le regex, quindi passa fixed = TRUE per il testo letterale.
  • strsplit() restituisce una lista (prendi [[1]]); trimws() ripulisce l'input con spazi in eccesso.

Prossimo passo: far entrare e uscire testo dai tuoi programmi, cioè stampare con print() e cat() e leggere l'input dell'utente.

Domande frequenti

Come si concatenano stringhe in R?

Con paste() o paste0(): R non ha il + per le stringhe. paste("data", "science") dà "data science" (separate da uno spazio di default); paste0("data", "science") le unisce senza niente in mezzo. Usa sep = per cambiare il separatore e collapse = per fondere un intero vettore in una sola stringa.

Come si ottiene la lunghezza di una stringa in R?

nchar("hello") restituisce 5, il numero di caratteri. length("hello") restituisce 1: in R, length() conta gli elementi di un vettore, e una singola stringa è un vettore di un elemento. Confondere length() con nchar() è il classico errore di chi inizia.

Qual è la differenza tra sub() e gsub() in R?

Entrambe cercano e sostituiscono, ma sub() sostituisce solo la prima corrispondenza mentre gsub() ("global sub") le sostituisce tutte. Entrambe trattano il pattern come un'espressione regolare di default: passa fixed = TRUE per cercare invece il testo letterale.

Come si divide una stringa in R?

strsplit(x, split) divide in base a un pattern, ma restituisce una lista (perché può dividere molte stringhe insieme). Per una sola stringa, prendi il primo elemento: strsplit("a,b,c", ",")[[1]] dà il vettore di caratteri "a" "b" "c".

Illustrazione dei linguaggi di programmazione di Coddy

Impara a programmare con Coddy

INIZIA