Ga naar hoofdinhoud

Zo los je de Non-numeric argument to binary operator-fout in R op

De non-numeric argument to binary operator-fout in R ontstaat wanneer je probeert te rekenen met niet-numerieke data, zoals een tekenreeks of factor.
· 8 min lezen

Verken met AI

Je bent deze fout misschien tegengekomen tijdens het programmeren in R: Error: non-numeric argument to binary operator. Dit kan gebeuren wanneer je een wiskundige bewerking uitvoert op data met niet-numerieke waarden, zoals strings of karakters.

In deze tutorial laat ik je zien hoe je deze fout aanpakt en oplost. Eerst geef ik een kort antwoord en daarna ga ik dieper in op waarom deze fout optreedt.

Het korte antwoord: zo los je de Non-numeric argument to binary operator-fout in R op

Voor wie haast heeft: het oplossen van de non-numeric argument to binary operator-fout in R houdt in dat je data naar numerieke types converteert voordat je rekenkundige bewerkingen uitvoert. Zo zorg je ervoor dat alle elementen in je data geschikt zijn voor wiskundige berekeningen.

In het volgende voorbeeld zet de functie as.numeric() de vector characters direct om naar numeriek, zodat de optelling zonder fout wordt uitgevoerd.

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

characters <- as.numeric(characters)

result <- characters + 10

print(result)

Waarom de fout optreedt

In R zijn rekenkundige bewerkingen bedoeld voor numerieke datatypes. Als je de non-numeric argument to binary operator-fout krijgt, wijst dat meestal op verkeerd gebruik van rekenoperatoren met niet-numerieke datatypes, zoals strings of factors. Voor meer over R-datatypes, lees onze tutorial Data Types in R.

Dit kan gebeuren in een aantal veelvoorkomende situaties:

  • Bewerkingen op tekenreeksen (character strings): De fout kan optreden wanneer je rekenkundige bewerkingen uitvoert op tekstdata.
  • Bewerkingen op factor-datatypes: De fout treedt op wanneer R strings binnen data frames bij het importeren omzet naar factors, wat leidt tot onbedoelde niet-numerieke types.
  • Bewerkingen op lijsten of andere complexe structuren: De fout treedt ook op wanneer je rekenoperatoren gebruikt op lijsten of vergelijkbare structuren die ongeschikt zijn voor zulke bewerkingen.

Hoe je de fout reproduceert en oplost

Laten we een eenvoudige dataset maken en bewerkingen uitvoeren die deze fout bewust uitlokken om te laten zien hoe dat kan gebeuren. Vervolgens lossen we de fout in elk geval op.

Hoe je de fout voor character strings reproduceert en oplost

In ons eerste voorbeeld zien we deze foutmelding omdat de elementen van de vector characters geen numeriek type hebben maar tekenreeksen zijn.

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

result <- characters + 10

print(result)

Om dit op te lossen, converteren we naar numeriek met as.numeric():

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

characters <- as.numeric(characters)

result <- characters + 10

print(result)

Hoe je de fout voor factors reproduceert en oplost

In ons volgende voorbeeld reproduceren we de fout voor factors.

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

result <- factors + 10

print(result)

Om dit op te lossen, converteren we naar numeriek door eerst naar character om te zetten. Dit doen we omdat factors in R als integer-vectoren met bijbehorende karakterlevels worden opgeslagen.

Wanneer je een factor direct met as.numeric() naar numeriek omzet, geeft R de onderliggende integer-codes terug, dus de interne numerieke representatie van de factorlevels, in plaats van de werkelijke karakterwaarden. Door de factor eerst naar character om te zetten, krijg je de daadwerkelijke levels als tekenreeksen, die vervolgens correct naar numeriek kunnen worden geconverteerd.

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

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

result <- factors + 10

print(result)

Hoe je de fout voor lijsten reproduceert en oplost

In ons volgende voorbeeld reproduceren we de fout voor lijsten. 

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

result <- list_data + 10

print(result)

Om dit op te lossen, halen we elementen eruit en zetten we ze om naar numeriek. De functie unlist() zet de lijst om in een vector. 

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

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

result <- list_data + 10

print(result)

Hoe je de fout voor gemengde datatypes reproduceert en oplost

Dit volgende voorbeeld is wat ingewikkelder. Geen van onze eerdere technieken zou hier werken, omdat we "20a" tegenkomen, wat niet naar een numerieke waarde kan worden geconverteerd. 

De functie sapply() biedt hier een goede oplossing. Die past een opgegeven functie toe op elk element van onze vector. In ons geval definiëren we een functie die probeert elk element naar een numerieke waarde te converteren.

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)

Voor meer informatie over functioneel programmeren in R, bekijk onze cursus Intermediate Functional Programming with purrr. Voor meer over de apply()-familie van functies, lees onze Tutorial over de R Apply-familie. 

Extra dingen om te weten

Debuggen met traceback

Wanneer er een fout optreedt, kan traceback() een waardevol hulpmiddel zijn voor debuggen. Het geeft de reeks aanroepen die tot de fout hebben geleid, zodat je het exacte faalpunt kunt vinden.

traceback()

Na het uitvoeren van dit commando print R de reeks functieaanroepen die tot de fout hebben geleid. Dit kan inzicht geven in waar niet-numerieke data is geïntroduceerd.

Controleer methoden voor datainvoer

Je kunt ook dubbelchecken hoe data wordt geïmporteerd en zorgen dat deze correct wordt geconverteerd. Bij het importeren van data, vooral uit CSV-bestanden, kan R karakterdata automatisch naar factors converteren. Het is belangrijk dit gedrag te sturen zodat je data correct wordt ingelezen.

# Stel dat data uit een CSV is ingelezen en onjuist als factors is geïmporteerd
data <- read.csv("data.csv", stringsAsFactors = TRUE)

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

In dit voorbeeld wordt data uit een CSV-bestand geïmporteerd met stringsAsFactors op TRUE. We zetten vervolgens de factor-kolom om naar character en daarna naar numeriek om het juiste datatype voor rekenkundige bewerkingen te garanderen.

Hoe je de fout voorkomt

Voorwaardelijke controles gebruiken

Om te helpen voorkomen dat deze fout optreedt, kun je voorwaardelijke controles inbouwen om te waarborgen dat datatypes geschikt zijn voor bewerkingen. Het controleren van het datatype en waar nodig voorwaardelijk converteren is goede praktijk voordat je bewerkingen uitvoert.

In het volgende voorbeeld controleren we of de data numeriek is. Zo niet, dan zetten we deze om naar numeriek voordat we de rekenkundige bewerking uitvoeren. Dit vangt verkeerde datatypes af en zet ze naar numeriek om. 

data <- "20"

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

print(result)

voorbeeld voorwaardelijke controles

Conclusie en extra bronnen

Ik hoop dat dit artikel je heeft geholpen om je probleem op te lossen. Fouten zoals de non-numeric argument to binary operator-fout komen vaak voor in programmeren, en weten hoe je ermee omgaat is belangrijk. Inzicht in datatypes en juiste conversies kan helpen om deze fout te voorkomen.

Voor hulp met R kun je onze R-cheat sheets bekijken of onze gratis cursus Introduction to R, of ga voor meer diepgang aan de slag met onze R Programming Skill Track.

Austin Chia

Auteur

Austin Chia

Ik ben Austin, een blogger en techschrijver met jarenlange ervaring als zowel datascientist als data-analist in de gezondheidszorg. Ik begon mijn techreis met een achtergrond in biologie en help nu anderen dezelfde overstap te maken via mijn techblog. Mijn passie voor technologie heeft geleid tot schrijfbijdragen aan tientallen SaaS-bedrijven, waarmee ik anderen inspireer en mijn ervaringen deel.

Veelgestelde vragen

Wat is een niet-numeriek argument?

Een niet-numeriek argument is een waarde of variabele die in een programmeertaal zoals R niet als getal kan worden geïnterpreteerd.

Hoe kan ik deze fout in mijn code herkennen?

Het foutbericht bevat meestal de zin "non-numeric argument", waardoor het makkelijk te herkennen is.

Komt deze fout alleen in R voor?

Nee, deze fout kan ook in andere programmeertalen voorkomen. Het foutbericht kan er echter anders uitzien.

Is er een manier om deze fout volledig te vermijden?

Ja, door ervoor te zorgen dat alle waarden en variabelen in je code compatibel zijn met de specifieke operator die je gebruikt.

Kan ik elk type operator gebruiken met niet-numerieke argumenten?

Nee, sommige operatoren kunnen alleen met numerieke waarden worden gebruikt en leveren deze fout op als ze niet-numerieke argumenten krijgen.

Onderwerpen