NA-definierte Werte werden nicht erkannt

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
Ilonia
Beiträge: 30
Registriert: Mi Aug 09, 2017 3:50 pm

NA-definierte Werte werden nicht erkannt

Beitrag 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
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: NA-definierte Werte werden nicht erkannt

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Ilonia
Beiträge: 30
Registriert: Mi Aug 09, 2017 3:50 pm

Re: NA-definierte Werte werden nicht erkannt

Beitrag 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!
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: NA-definierte Werte werden nicht erkannt

Beitrag 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).

Code: Alles auswählen

Calvi$WDSP[Calvi$WDSP>99.8] <- NA
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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: NA-definierte Werte werden nicht erkannt

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Benutzeravatar
EDi
Beiträge: 1599
Registriert: Sa Okt 08, 2016 3:39 pm

Re: NA-definierte Werte werden nicht erkannt

Beitrag 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])
Bitte immer ein reproduzierbares Minimalbeispiel angeben. Meinungen gehören mir und geben nicht die meines Brötchengebers wieder.

Dieser Beitrag ist lizensiert unter einer CC BY 4.0 Lizenz
Bild.
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: NA-definierte Werte werden nicht erkannt

Beitrag von bigben »

Wieder was gelernt. Danke, EDi.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Ilonia
Beiträge: 30
Registriert: Mi Aug 09, 2017 3:50 pm

Re: NA-definierte Werte werden nicht erkannt

Beitrag 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).

Code: Alles auswählen

Calvi$WDSP[Calvi$WDSP>99.8] <- NA
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!
bigben
Beiträge: 2771
Registriert: Mi Okt 12, 2016 9:09 am

Re: NA-definierte Werte werden nicht erkannt

Beitrag 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
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Ilonia
Beiträge: 30
Registriert: Mi Aug 09, 2017 3:50 pm

Re: NA-definierte Werte werden nicht erkannt

Beitrag 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!
Antworten