as.numeric() rundet Werte falsch

Allgemeine Statistik mit R, die Test-Methode ist noch nicht bekannt, ich habe noch keinen Plan!

Moderatoren: EDi, jogo

Antworten
knuffikatze
Beiträge: 28
Registriert: Mi Apr 19, 2017 9:04 pm

as.numeric() rundet Werte falsch

Beitrag von knuffikatze »

Hallo,

es wäre sehr nett wenn ihr mir mit folgendem Problem weiterhelfen könntet.
Ich habe eine character Variable a<-"6331769013055877317"
Wenn ich nun is.numeric(a)=6331769013055877120 erhalte ich eine falsche Zahl. Auch die Verwendung von

options(digits=20)

hilft hier nicht weiter. Zudem ist das Ergebnis von

6331769013055800320-6331769013055800321=0

Irgendwo wird hier also gerundet. Das macht mich wahnsinnig. Könnt ihr mir helfen?

Vielen Dank schon mal!!!
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: as.numeric() rundet Werte falsch

Beitrag von jogo »

Hallo knuffikatze,

willkommen im Forum!
Computerarithmetik hat eine begrenzte Genauigkeit und eine andere Basis für die interne Zahlendarstellung.
http://stackoverflow.com/questions/9508 ... -not-equal
Diese Phänomen trifft bei Dir zu, weil Deine Zahlen so groß sind, dass sie nicht mehr als integer dargestellt werden können sondern nur noch als Gleitkommazahlen. https://de.wikipedia.org/wiki/IEEE_754
Wenn Du mit beliebiger Genauigkeit arbeiten willst, benötigst Du andere Programme, Stichwort "arbitrary precision arithmetic".
Einige Formalmanipulatoren können das.

Gruß, Jörg
knuffikatze
Beiträge: 28
Registriert: Mi Apr 19, 2017 9:04 pm

Re: as.numeric() rundet Werte falsch

Beitrag von knuffikatze »

Hallo Jörg,

Bedeutet das, dass ich sowas mit R gar nicht bestimmen kann? Die Zahlen können mir als character ja angezeigt werden. Ich benötige Sie auch nur als eine Art Kundennummer, mit dem ich nicht weiterrechnen muss. Aber ich habe sie einmal als Charakter und einmal numerisch vorliegen und würde sie gerne anpassen, damit ich sie vergleichen kann. Gibt es hier eine andere Lösung?

Vielen Dank
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: as.numeric() rundet Werte falsch

Beitrag von jogo »

Hallo Knuffikatze,
knuffikatze hat geschrieben: Mi Apr 19, 2017 10:35 pm Bedeutet das, dass ich sowas mit R gar nicht bestimmen kann? Die Zahlen können mir als character ja angezeigt werden. Ich benötige Sie auch nur als eine Art Kundennummer,
als character geht das.
mit dem ich nicht weiterrechnen muss.
so ist gut, ansonsten müsste ich Dich jetzt fragen, was denn die Differenz zwischen zwei Kundennummern darstellen soll?
Kundennummern sind nominal skaliert.
Aber ich habe sie einmal als Charakter und einmal numerisch vorliegen und würde sie gerne anpassen, damit ich sie vergleichen kann. Gibt es hier eine andere Lösung?
Da wir jetzt geklärt haben, dass Kundennummern keine Zahlen sind, mit denen man rechnen kann, sind character eine gute Lösung. Mindestens auf Gleichheit kann man testen und andere lustige Sachen.

Gruß, Jörg
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: as.numeric() rundet Werte falsch

Beitrag von bigben »

Hallo!

Wenn alle Kundennummern gleich viele Stellen haben, dann kann man auch größer und kleiner-Vergleiche anstellen, weil arithmetische und alphabetische Reihenfolge dann zueinander passen. Damit wird zum Beispiel Sortieren möglich.

Code: Alles auswählen

> "a"<"b"
[1] TRUE
> "b"<"a"
[1] FALSE
> "001234"<"002234"
[1] TRUE
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
knuffikatze
Beiträge: 28
Registriert: Mi Apr 19, 2017 9:04 pm

Re: as.numeric() rundet Werte falsch

Beitrag von knuffikatze »

Ok, dann noch eine Frage. Ich habe diese Kundennummern innerhalb eines Dataframe. Da sind sie aber als numeric drin. Wie bekomme ich diese innerhalb des Dataframe in character umgewandelt?

Danke schon mal.

Gruß
EVa
jogo
Beiträge: 2085
Registriert: Fr Okt 07, 2016 8:25 am

Re: as.numeric() rundet Werte falsch

Beitrag von jogo »

Hallo Eva,

so:

Code: Alles auswählen

DataFrame$Kundennummer <- as.character(DataFrame$Kundennummer)
Falls Du führende Nullen in der Kundennummer hattest, waren diese schon weg, als die Kundennummer als numeric abgelegt wurde: dann hilft sprintf(). Wenn man es beim Einlesen richten möchte, kann man read.table(...., colClasses=...) verwenden.

Gruß, Jörg
Antworten