Indice
coalesce (dplyr)
La funzione coalesce() del pacchetto dplyr in R serve a sostituire i valori mancanti (NA) in un vettore (o in una serie di vettori) prendendo il primo valore non mancante da una sequenza di input, posizione per posizione.
In parole semplici, per ogni elemento, coalesce() controlla il primo vettore. Se il valore non è NA, lo restituisce. Se è NA, controlla il secondo vettore nella stessa posizione, e così via.
Insieme a join() e mutate() si rivela particolarmente utile per correggere o aggiornare i dati.
Per sostituire gli NA
Con un valore
Creiamo un vettore casuale, di 8 elementi, di cui 3 NA:
set.seed(123) # per riproducibilità x <- sample(c(1:5, NA, NA, NA))
[1] NA NA 3 NA 2 4 5 1
Sostituiamo gli NA con 0:
coalesce(x, 0L)
[1] 0 0 3 0 2 4 5 1
Per sostituire tutti gli NA con un valore, si può usare anche replace_na() di tidyr
replace_na(x, 0)
Con un vettore
In questo caso, i valori NA del vettore y vengono sostituiti dai valori del vettore z che sono nella stessa posizione:
y <- c(1, 2, NA, NA, 5) z <- c(NA, NA, 3, 4, 5) coalesce(y, z)
[1] 1 2 3 4 5
In pratica, questa funzione si può usare – con le dovute cautele – anche per unire informazioni frammentate su più dataset.
Con join per correggere o aggiornare i dati
Se, da sola, la funzione ha il vincolo della lunghezza identica dei due vettori (quello da correggere e quello con le correzioni), questo limite può essere superato utilizzandola in un’operazione di join fra un dataframe con una variabile da correggere e uno con una variabile di correzioni.
Costruiamo un dataframe di parole con due errori ortografici:
df1 <- data.frame( id = 1:5, word = c("mela", "pera", "banan", "arancia", "kiw") ) df1
id word 1 1 mela 2 2 pera 3 3 banan 4 4 arancia 5 5 kiw
Costruiamo un dizionario con i soli dati da correggere e le correzioni:
# dizionario con correzioni / sostituzioni df2 <- data.frame( errore = c("banan", "kiw"), correz = c("banana", "kiwi") ) df2
errore correz 1 banan banana 2 kiw kiwi
La funzione left_join() aggiungerà la colonna di correzioni (correz) con valori NA corrispondenti ai dati che non sono da sostituire:
df1 %>% left_join(df2, by = c("word" = "errore"))
id word correz 1 1 mela <NA> 2 2 pera <NA> 3 3 banan banana 4 4 arancia <NA> 5 5 kiw kiwi
A questo punto coalesce() cerca gli NA di correz, e li sostituisce con il vettore word. Poiché è usato all’interno di mutate(), la nuova variabile word sarà il risultato di questa operazione.
df1 %>% left_join(df2, by = c("word" = "errore")) %>% # notare l'ordine: prima 'correz', poi 'word' mutate(word = coalesce(correz, word))
id word correz 1 1 mela <NA> 2 2 pera <NA> 3 3 banana banana 4 4 arancia <NA> 5 5 kiwi kiwi
df1 <- df1 %>% left_join(df2, by = c("word" = "errore")) %>% mutate(word = coalesce(correz, word)) %>% # per eliminare la colonna creata dal join select(-correz) df1
id word 1 1 mela 2 2 pera 3 3 banana 4 4 arancia 5 5 kiwi
Script di esempio
E' possibile scaricare ed eseguire lo script dell'esempio:
- es_coalesce.R
set.seed(123) # per riproducibilità x <- sample(c(1:5, NA, NA, NA)) coalesce(x, 0L) y <- c(1, 2, NA, NA, 5) z <- c(NA, NA, 3, 4, 5) coalesce(y, z) # con join e mutate # dataframe con errori df1 <- data.frame( id = 1:5, word = c("mela", "pera", "banan", "arancia", "kiw") ) # dizionario con correzioni / sostituzioni df2 <- data.frame( errore = c("banan", "kiw"), correz = c("banana", "kiwi") ) df1 <- df1 %>% left_join(df2, by = c("word" = "errore")) %>% mutate(word = coalesce(correz, word)) %>% # per eliminare la colonna creata dal join select(-correz)
