Ricerca Sociale con R

Una wiki per l'analisi dei dati con R

Strumenti Utente

Strumenti Sito


r:tidyverse:dplyr_coalesce

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)

Domande? Scrivimi

Messenger Telegram Email
r/tidyverse/dplyr_coalesce.txt · Ultima modifica: 02/09/2025 14:52 da Agnese Vardanega