Seite 1 von 1
NA-definierte Werte werden nicht erkannt
Verfasst: Mo Sep 25, 2017 2:04 pm
von Ilonia
Hallo zusammen,
ich habe folgendes Problem.
Ich habe einen Datensatz eingelesen:
Code: Alles auswählen
Calvi<- read.table("Calvi.txt",sep=",", header=T, stringsAsFactors = F,na.strings=c("99.99"," 9999.9","999.9","NA"))
habe dabei verschiedene NA-Werte definiert, bei denen ich ausgegangen bin, dass mit diesen Werten dann nicht gerechnet wird.
Folgendermaßen sieht der Datensatz aus.
Code: Alles auswählen
head(Calvi)
STN... WBAN YEARMODA TEMP X DEWP X.1 SLP X.2 STP X.3 VISIB X.4 WDSP X.5
1 77540 99999 1973-07-27 71.2 4 NA 0 NA 0 NA 0 999.9 0 5.0 4
2 77540 99999 1973-08-04 68.4 4 NA 0 NA 0 NA 0 999.9 0 6.4 4
3 77540 99999 1973-10-03 68.0 4 NA 0 NA 0 NA 0 999.9 0 3.0 4
4 77540 99999 1973-10-20 62.6 4 NA 0 NA 0 NA 0 999.9 0 4.5 4
5 77540 99999 1973-11-23 54.5 4 NA 0 NA 0 NA 0 999.9 0 2.5 4
6 77540 99999 1973-12-10 44.1 4 NA 0 NA 0 NA 0 999.9 0 999.9 0
MXSPD GUST MAX MIN PRCP SNDP FRSHTT X.6
1 11.8 999.9 80.6 59.0 0 NA 0 NA
2 11.8 999.9 78.8 62.6 0 NA 0 NA
3 5.8 999.9 77.0 64.4 0 NA 0 NA
4 8.0 999.9 84.2 53.6 0 NA 0 NA
5 8.0 999.9 64.4 48.2 0 NA 0 NA
6 999.9 999.9 51.8 39.2 0 NA 0 NA
Jetzt wollte ich die Einheiten verschiedener Parameter umrechnen
zB:
Code: Alles auswählen
library(weathermetrics)
Calvi$ws_ms <- knots_to_speed(Calvi$WDSP,unit="mps",round=1)
wie man in dem 'head-Output' sieht, ist an 6. Stelle der Spalte "WDSP" ein 999.9. Ich dachte, nach der Umrechnung bleibt das auch stehen, aber es wird umgerechnet und danach steht ein Wert von 514.4; was an sich ja richtig umgerechnet ist, ich aber doch gerne für weitere Berechnungen das 999.9 stehen hätte (wozu definiere ich das denn sonst am Anfang?...)
Ums nochmal kurz zusammenzufassen: Mein R beachtet (meiner Ansicht nach) die NA-definierten Werte vom Anfang nicht...
Woran könnte das liegen? Hab ich irgendeinen Denkfehler?
Vielen lieben Dank für eure Hilfe schon mal!
Liebe Grüße
Re: NA-definierte Werte werden nicht erkannt
Verfasst: Mo Sep 25, 2017 2:35 pm
von bigben
Ilonia hat geschrieben: Mo Sep 25, 2017 2:04 pm
Code: Alles auswählen
Calvi<- read.table("Calvi.txt",sep=",", header=T, stringsAsFactors = F,na.strings=c("99.99"," 9999.9","999.9","NA"))
habe dabei verschiedene NA-Werte definiert, bei denen ich ausgegangen bin, dass mit diesen Werten dann nicht gerechnet wird.
Hallo Ilonia,
was mir in Deiner obigen Code-Zeile auffällt, ist das Leerzeichen in " 9999.9". Dieses Leerzeichen stellt einen Bezug nur zu Strings, nicht mehr zu Zahlen her. Das kannst Du am folgenden Beispiel erkennen:
Code: Alles auswählen
> read.table(na.strings = c(" 99.0", "23.1"), text="
+ 17.0 23.1
+ 18.0 99.0
+ 19.0 20.0")
V1 V2
1 17 NA
2 18 99
3 19 20
Die "23.1" wurde korrekt als NA erkannt. Die 99.0 wurde aber eingelesen, wegen des führenden Leerzeichens in
na.strings.
Prüfe doch nochmal, ob sich nicht ähnliches in Deinem Originalcode auch bei 999.9 eingeschlichen hat. Wenn Du gar nicht dahinter kommst, was falsch gelaufen ist, kann man das auch immer noch später, nach dem Einlesen, austauschen. Fast immer ist es sinnvoll, neben head(Calvi) auch str(Calvi) anzugeben. Ggf. kann das helfen.
Dringend abraten würde ich davon, TRUE durch T abzukürzen und FALSE durch F abzukürzen. Da muss man nur einmal in einem unaufmerksamen Moment T = 0 schreiben, und schon funktioniert die read.table-Zeile nicht mehr. Viel Spaß dann bei der Fehlersuche!
LG,
Bernhard
Re: NA-definierte Werte werden nicht erkannt
Verfasst: Mo Sep 25, 2017 2:51 pm
von Ilonia
Hallo Bernhard,
vielen Dank für deine schnelle Antwort.
Danke für den Hinweis mit der Leerstelle. Hab ich nun im Original-Code auch geändert. Allerdings war hier das Problem nicht bei "9999.99" sondern bei "999.99". Deswegen ist das Problem immer noch vorhanden.
Hier mal die Struktur vom Original-Datensatz direkt nach dem Einlesen (hatte ich davor nicht gezeigt, weil hier der 'Problem-Fall' nicht sichtbar ist)
Code: Alles auswählen
> str(Calvi)
'data.frame': 13524 obs. of 23 variables:
$ STN... : int 77540 77540 77540 77540 77540 77540 77540 77540 77540 77540 ...
$ WBAN : int 99999 99999 99999 99999 99999 99999 99999 99999 99999 99999 ...
$ YEARMODA: int 19730727 19730804 19731003 19731020 19731123 19731210 19731213 19731227 19740118 19740311 ...
$ TEMP : num 71.2 68.4 68 62.6 54.5 44.1 44.6 45.5 46 45.5 ...
$ X : int 4 4 4 4 4 4 4 4 4 4 ...
$ DEWP : num 10000 10000 10000 10000 10000 ...
$ X.1 : int 0 0 0 0 0 0 0 0 0 0 ...
$ SLP : num 10000 10000 10000 10000 10000 ...
$ X.2 : int 0 0 0 0 0 0 0 0 0 0 ...
$ STP : num 10000 10000 10000 10000 10000 ...
$ X.3 : int 0 0 0 0 0 0 0 0 0 0 ...
$ VISIB : num 1000 1000 1000 1000 1000 ...
$ X.4 : int 0 0 0 0 0 0 0 0 0 0 ...
$ WDSP : num 5 6.4 3 4.5 2.5 ...
$ X.5 : int 4 4 4 4 4 0 0 0 0 4 ...
$ MXSPD : num 11.8 11.8 5.8 8 8 ...
$ GUST : num 1000 1000 1000 1000 1000 ...
$ MAX : chr " 80.6*" " 78.8*" " 77.0*" " 84.2*" ...
$ MIN : chr " 59.0*" " 62.6*" " 64.4*" " 53.6*" ...
$ PRCP : chr " 0.00E" " 0.00I" " 0.00I" " 0.00I" ...
$ SNDP : num NA NA NA NA NA NA NA NA NA NA ...
$ FRSHTT : int 0 0 0 0 0 0 0 0 0 0 ...
$ X.6 : logi NA NA NA NA NA NA ...
Habe anschließend noch folgendes gemacht (sollte allerdings keine Auswirkungen auf mein eigentliches Problem werfen (nur zur Vollständigkeit mit eingefügt; nicht dass es doch ausschlaggebend ist

)
Code: Alles auswählen
library(stringr)
Calvi$YEARMODA <- as.Date(as.character(Calvi$YEARMODA),format= "%Y%m%d")
### Extract Values
numextract <- function(string){
str_extract(string, "\\-*\\d+\\.*\\d*")
}
Calvi$MAX <- numextract(Calvi$MAX)
Calvi$MIN <- numextract(Calvi$MIN)
Calvi$PRCP <- numextract(Calvi$PRCP)
### Convert Character -> Numeric
Calvi$MIN <- as.numeric(as.character(Calvi$MIN))
Calvi$MAX <- as.numeric(as.character(Calvi$MAX))
Calvi$PRCP <- as.numeric(as.character(Calvi$PRCP))
Calvi$ws_ms <- knots_to_speed(Calvi$WDSP,unit="mps",round=1)
Hier wäre auch der Link zu dem Original-Datensatz, sollte dieser benötigt werden!
https://www1.ncdc.noaa.gov/pub/orders/C ... 439310.txt
Vielen Dank nochmal für die Hilfe!
Re: NA-definierte Werte werden nicht erkannt
Verfasst: Mo Sep 25, 2017 4:01 pm
von bigben
Hallo Ilonia,
Ilonia hat geschrieben: Mo Sep 25, 2017 2:51 pm Deswegen ist das Problem immer noch vorhanden.
Schade, ich hatte gehofft, dass Du in Deinem Original-Code vielleicht eine Leerstelle mehr hast, als im hier geposteten. Aus der Ferne kann ich nicht erkennen, wo sich das Problem eingestellt hat und würde daher vorschlagen, das Problem jetzt nachträglich anzugehen (ist nur der zweiteleganteste Weg).
Das sollte alle Werte in WDSP die größer als 99,8 sind mit NA überschreiben. Probier bitte mal, ob das klappt.
hatte ich davor nicht gezeigt, weil hier der 'Problem-Fall' nicht sichtbar ist
Ist verständlich, aber immer mal wieder versteckt sich das Problem doch in den Datentypen und dann ist es gut zu wissen, dass das bei Dir alles Zahlen sind und keine Strings oder Faktoren.
LG,
Bernhard
Re: NA-definierte Werte werden nicht erkannt
Verfasst: Mo Sep 25, 2017 4:15 pm
von bigben
Für die anderen im Forum: Ein einfaches reproduzierbares Beispiel ist:
Code: Alles auswählen
Calvi <- read.table("https://www1.ncdc.noaa.gov/pub/orders/CDO1332887439310.txt",
na.strings = c("NA", "999.9"), sep = ",", header=TRUE)
print(Calvi$WDSP[6])
LG,
Bernhard
Re: NA-definierte Werte werden nicht erkannt
Verfasst: Mo Sep 25, 2017 11:22 pm
von EDi
Bitte das strip.white= argument beachten [default ist FALSE!]. In Kombination mit der Erläuterung zu na.strings= ergibt das:
Code: Alles auswählen
Calvi <- read.table("https://www1.ncdc.noaa.gov/pub/orders/CDO1332887439310.txt",
na.strings = c("NA", "999.9"), sep = ",", header=TRUE, strip.white = TRUE)
print(Calvi$WDSP[6])
Re: NA-definierte Werte werden nicht erkannt
Verfasst: Di Sep 26, 2017 7:59 am
von bigben
Wieder was gelernt. Danke, EDi.
LG,
Bernhard
Re: NA-definierte Werte werden nicht erkannt
Verfasst: Di Sep 26, 2017 12:01 pm
von Ilonia
bigben hat geschrieben: Mo Sep 25, 2017 4:01 pm
Schade, ich hatte gehofft, dass Du in Deinem Original-Code vielleicht eine Leerstelle mehr hast, als im hier geposteten. Aus der Ferne kann ich nicht erkennen, wo sich das Problem eingestellt hat und würde daher vorschlagen, das Problem jetzt nachträglich anzugehen (ist nur der zweiteleganteste Weg).
Das sollte alle Werte in WDSP die größer als 99,8 sind mit NA überschreiben. Probier bitte mal, ob das klappt.
Danke, das hat funktioniert! Aber wie du schon geschrieben hast, es ist eine sehr unelegante Lösung, da ich das jetzt auf mehrere Spalten und mehreren Dateien extra schreiben muss...
Vielen Dank für die Hilfe!
Re: NA-definierte Werte werden nicht erkannt
Verfasst: Di Sep 26, 2017 1:59 pm
von bigben
Naja, einmal wäre das Anwenden auf alle Spalten im Datensatz ein einziger Aufruf von apply() und zum anderen hat EDi ja gezeigt, wie man es richtig macht.
LG,
Bernhard
Re: NA-definierte Werte werden nicht erkannt
Verfasst: Di Sep 26, 2017 2:12 pm
von Ilonia
bigben hat geschrieben: Di Sep 26, 2017 1:59 pm
Naja, einmal wäre das Anwenden auf alle Spalten im Datensatz ein einziger Aufruf von apply() und zum anderen hat EDi ja gezeigt, wie man es richtig macht.
LG,
Bernhard
Das stimmt...Da hab ich den Code von EDi übernommen aber nicht richtig laufen lassen und hab mich schon gewundert warum das nicht geklappt hat....
Aber jetzt ist alles gut und ich bin glücklich!
Vielen lieben Dank!