Seite 1 von 1

as.numeric() rundet Werte falsch

Verfasst: Mi Apr 19, 2017 9:15 pm
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!!!

Re: as.numeric() rundet Werte falsch

Verfasst: Mi Apr 19, 2017 9:37 pm
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

Re: as.numeric() rundet Werte falsch

Verfasst: Mi Apr 19, 2017 10:35 pm
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

Re: as.numeric() rundet Werte falsch

Verfasst: Mi Apr 19, 2017 11:03 pm
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

Re: as.numeric() rundet Werte falsch

Verfasst: Do Apr 20, 2017 8:04 am
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

Re: as.numeric() rundet Werte falsch

Verfasst: Do Apr 20, 2017 8:07 am
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

Re: as.numeric() rundet Werte falsch

Verfasst: Do Apr 20, 2017 12:27 pm
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