Vai al contenuto principale

Come risolvere l'errore Non-numeric argument to binary operator in R

L'errore non-numeric argument to binary operator in R si verifica quando provi a fare operazioni aritmetiche su dati non numerici, come una stringa di caratteri o un fattore.
· 8 min leggi

Scopri con l'IA

Potresti esserti imbattuto in questo errore programmando in R: Error: non-numeric argument to binary operator. Può capitare quando esegui un'operazione matematica su dati che contengono valori non numerici, come stringhe o caratteri.

In questo tutorial ti mostrerò come affrontare e risolvere questo errore. Prima ti darò una risposta breve, poi andrò più a fondo per aiutarti a capire meglio perché si verifica.

La risposta breve: come risolvere l'errore Non-numeric argument to binary operator in R

Se vai di fretta, risolvere l'errore non-numeric argument to binary operator in R significa convertire i dati in tipi numerici prima di effettuare operazioni aritmetiche. Questo assicura che tutti gli elementi dei tuoi dati siano idonei ai calcoli.

Nell'esempio seguente, la funzione as.numeric() converte direttamente il vettore characters in numerico, garantendo che l'operazione di addizione venga eseguita senza errori.

characters <- c("5", "10", "15")

characters <- as.numeric(characters)

result <- characters + 10

print(result)

Perché si verifica l'errore

In R, le operazioni aritmetiche sono pensate per funzionare con tipi di dati numerici. Quando ti imbatti nell'errore non-numeric argument to binary operator, di solito indica un uso improprio degli operatori aritmetici con tipi di dati non numerici, come stringhe o fattori. Per saperne di più sui tipi di dati in R, leggi il nostro tutorial Data Types in R.

Questo può avvenire in diversi scenari comuni:

  • Operazioni su stringhe di caratteri: L'errore può verificarsi quando provi a eseguire operazioni aritmetiche su dati testuali.
  • Operazioni su tipi di dato factor: L'errore si verifica quando R converte le stringhe in fattori all'interno dei data frame, soprattutto in fase di importazione, portando a tipi non numerici indesiderati.
  • Operazioni su liste o altre strutture complesse: L'errore si verifica anche quando usi operatori aritmetici su liste o strutture simili non adatte a tali operazioni.

Come riprodurre e risolvere l'errore

Creiamo un semplice dataset ed eseguiamo operazioni che genereranno intenzionalmente questo errore per mostrare come si verifica. Poi lo risolveremo in ciascun caso.

Come riprodurre e risolvere l'errore per le stringhe di caratteri

Nel primo esempio vediamo questo messaggio di errore perché gli elementi del vettore characters non sono di tipo numerico ma stringhe di caratteri.

characters <- c("5", "10", "15")

result <- characters + 10

print(result)

Per risolvere, convertiamo in numerico usando as.numeric():

characters <- c("5", "10", "15")

characters <- as.numeric(characters)

result <- characters + 10

print(result)

Come riprodurre e risolvere l'errore per i fattori

Nel prossimo esempio riprodurremo l'errore per i fattori.

factors <- factor(c("5", "10", "15"))

result <- factors + 10

print(result)

Per risolvere, convertiamo in numerico passando prima per character. Questo perché, in R, i fattori sono memorizzati come vettori di interi con un insieme corrispondente di livelli di caratteri.

Quando converti un fattore direttamente in numerico usando as.numeric(), R restituisce i codici interi sottostanti, cioè la rappresentazione interna dei livelli del fattore, invece dei valori testuali reali. Convertire prima il fattore in character recupera i livelli effettivi come stringhe, che poi possono essere convertite correttamente in numerico.

factors <- factor(c("5", "10", "15"))

factors <- as.numeric(as.character(factors))

result <- factors + 10

print(result)

Come riprodurre e risolvere l'errore per le liste

Nel prossimo esempio riprodurremo l'errore per le liste. 

list_data <- list("5", "10", "15")

result <- list_data + 10

print(result)

Per risolvere, estraiamo e convertiamo gli elementi in numerico. La funzione unlist() converte la lista in un vettore. 

list_data <- list("5", "10", "15")

list_data <- as.numeric(unlist(list_data))

result <- list_data + 10

print(result)

Come riprodurre e risolvere l'errore per tipi di dato misti

Questo esempio è un po' più complicato. Nessuna delle tecniche precedenti funzionerebbe qui perché incontreremmo "20a", che non può essere convertito in un valore numerico. 

La funzione sapply() offre una buona soluzione in questo caso. Applica una funzione specificata a ciascun elemento del nostro vettore. Nel nostro caso, definiamo una funzione che tenta di convertire ogni elemento in un valore numerico.

mixed_data <- list("5", 10, "15", "20a")

numeric_data <- sapply(mixed_data, function(x) {
  if (is.numeric(x)) {
    return(x)
  } else if (!is.na(as.numeric(x))) {
    return(as.numeric(x))
  } else {
    return(NA)
  }
})

result <- numeric_data + 10

print(result)

Per maggiori informazioni sulla programmazione funzionale in R, dai un'occhiata al nostro corso Intermediate Functional Programming with purrr. Per saperne di più sulla famiglia di funzioni apply(), leggi il nostro Tutorial sulla famiglia Apply in R. 

Altre cose da sapere

Debug con traceback

Quando si verifica un errore, traceback() può essere uno strumento prezioso per il debug. Fornisce la sequenza di chiamate che ha portato all'errore, aiutandoti a identificare il punto esatto del problema.

traceback()

Dopo aver eseguito questo comando, R stamperà la sequenza di chiamate di funzione che ha portato all'errore. Questo può offrire indicazioni su dove potrebbero essere stati introdotti dati non numerici.

Rivedi i metodi di input dei dati

Potresti anche voler ricontrollare come vengono importati i dati e assicurarti che siano convertiti correttamente. Quando importi i dati, in particolare da file CSV, R può convertire automaticamente i dati di tipo character in fattori. È importante controllare questo comportamento per garantire un'importazione corretta.

# Supponendo che i dati letti da un CSV siano stati importati in modo errato come fattori
data <- read.csv("data.csv", stringsAsFactors = TRUE)

data$column <- as.numeric(as.character(data$column))

In questo esempio, i dati vengono importati da un file CSV con stringsAsFactors impostato a TRUE. Convertiamo quindi la colonna factor in character e successivamente in numerico per garantire il tipo di dato corretto per le operazioni aritmetiche.

Come prevenire l'errore

Uso di controlli condizionali

Per evitare che questo errore si verifichi, prova a implementare controlli condizionali per assicurarti che i tipi di dato siano adatti alle operazioni. Verificare il tipo di dato e gestire le conversioni necessarie in modo condizionale è una buona pratica prima di eseguire le operazioni.

Nell'esempio seguente, verifichiamo se i dati sono numerici. In caso contrario, li convertiamo in numerico prima di procedere con l'operazione aritmetica. In questo modo intercettiamo eventuali tipi di dato errati e li convertiamo correttamente in numerico. 

data <- "20"

if(is.numeric(data)) {
  result <- data + 10
} else {
  data <- as.numeric(data)
  result <- data + 10
}

print(result)

esempio di controlli condizionali

Conclusione e risorse aggiuntive

Spero che questo articolo ti sia stato utile per risolvere il problema. Errori come il non-numeric argument to binary operator sono comuni in programmazione, e sapere come gestirli è importante. Comprendere i tipi di dato e le conversioni corrette aiuta a prevenire questo errore.

Per aiutarti con R, puoi consultare i nostri cheat sheet su R o il nostro corso gratuito Introduction to R oppure, per un approfondimento, prova il nostro R Programming Skill Track.

Austin Chia

Autore

Austin Chia

Sono Austin, blogger e autore tech con anni di esperienza come data scientist e data analyst nel settore sanitario. Partito dalla biologia, oggi aiuto altri a fare lo stesso passaggio attraverso il mio blog tecnologico. La mia passione per la tecnologia mi ha portato a collaborare come autore con decine di aziende SaaS, ispirando altre persone e condividendo le mie esperienze.

Domande frequenti

Che cos'è un argomento non numerico?

Un argomento non numerico è un valore o una variabile che non può essere interpretato come numero in un linguaggio di programmazione come R.

Come posso riconoscere questo errore nel mio codice?

Il messaggio di errore di solito include la frase "non-numeric argument", il che lo rende facile da individuare.

Questo errore si verifica solo in R?

No, questo errore può verificarsi anche in altri linguaggi di programmazione. Tuttavia, il messaggio di errore può apparire in modo diverso.

Esiste un modo per evitare del tutto questo errore?

Sì, assicurandoti che tutti i valori e le variabili nel tuo codice siano compatibili con lo specifico operatore utilizzato.

Posso usare qualsiasi tipo di operatore con argomenti non numerici?

No, alcuni operatori possono essere usati solo con valori numerici e genereranno questo errore se ricevono argomenti non numerici.

Argomenti

Correlato