Probleme beim Einlesen von Daten

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

Moderatoren: EDi, jogo

Antworten
FR1712
Beiträge: 17
Registriert: So Nov 11, 2018 11:23 pm

Probleme beim Einlesen von Daten

Beitrag von FR1712 »

Hallo liebes Forum,

für eine Hausarbeit benötige ich historische Klimadaten. Dazu habe ich einen entsprechenden Datensatz im Internet in Form vom txt-Dateien gefunden. Leider funktioniert das Einlesen nicht wie erwartet. Ich habe verschiedene Varianten ausprobiert, auch über den Button "Import Dataset", leider klappt das alles nicht.
Ich würde einfach mal den Link zu den Daten hier posten:
https://www1.ncdc.noaa.gov/pub/data/pal ... casty2007/
Es geht um die Dateien "precip-month.txt" und "temp-month.txt"
Wenn jemand eine ösung dafür hat, würde ich mich sehr freuen.

Beste Grüße,
Robert
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Probleme beim Einlesen von Daten

Beitrag von jogo »

Hallo Robert,

willkommen im Forum!
Das ist ein wirklich sehr spezielles Format mit einigen Kopfzeilen, z.B.:

Code: Alles auswählen

NAME "Monthly European Precipitation 1766-2000 [mm/month]"
LONGITUDES	180	50.00W	40.00E
LATITUDES	100	80.00N	30.00N	
NODATA_STRING	NA
NUMBER_OF_ROWS	2820
NUMBER_OF_COLUMS	18001	

YYYYMM	79.75N/49.75W	79.75N/49.25W	79.75N/48.75W	79.75N/48.25W	79.75N/47.75W	79.75N/47.25W	79.75N/46.75W	79.75N/46.25W	79.75N/45.75W	79.75N/45.25W	79.75N/44.75W	79.75N/44.25W	79.75N/43.75W	79.75N/43.25W	79.75N/42.75W	79.75N/42.25W	79.75N/41.75W	79.75N/41.25W	79.75N/40.75W	79.75N/40.25W	79.75N/39.75W	79.75N/39.25W	79.75N/38.75W	79.75N/38.25W	79.75N/37.75W	79.75N/37.25W	79.75N/36.75W	79.75N/36.25W	79.75N/35.75W	79.75N/35.25W	79.75N/34.75W	79.75N/34.25W	79.75N/33.75W	79.75N/33.25W	79.75N/32.75W	79.75N/32.25W	79.75N/31.75W	79.75N/31.25W	79.75N/30.75W	
Gibt es Webseite mit der Beschreibung der Daten und eventuell auch Hinweisen zum Einlesen der Daten?

Hier habe ich eine Beschreibung der Daten gefunden:
https://www1.ncdc.noaa.gov/pub/data/pal ... ty2007.txt

Gruß, Jörg
FR1712
Beiträge: 17
Registriert: So Nov 11, 2018 11:23 pm

Re: Probleme beim Einlesen von Daten

Beitrag von FR1712 »

Hallo Jörg,

dann beruhigt es mich erstmal, dass ich mir nicht allzu blöd vorkommen muss bezüglich der Frage. Bei meinen Recherchen habe ich bisher noch nichts dazu gefunden, wie man damit umzugehen hat. Allerdings weiß ich, dass dieser Datensatz in einigen Publikationen verwendet wird, weshalb ich schon denke, dass es da irgendeine Möglichkeit geben wird.
Hufeisen
Beiträge: 162
Registriert: Fr Aug 31, 2018 6:34 pm

Re: Probleme beim Einlesen von Daten

Beitrag von Hufeisen »

Hallo Robert,

es ist auf jeden Fall schwierig. Ich gucke mir gerade die precip-mon.txt an. Laut der read-me im von dir verlinkten Ordner ist sie durch Leerzeichen getrennt. Das stimmt aber nicht. Libre Office Calc erkennt auch Tabulatoren in Zeile 8 und doppelte und dreifache Leerzeichen. Wenn ich in Calc ab Zeile 8 einlesen lasse sowie Tabulator, Leerzeichen und Feldtrenner zusammenfassen auswähle (siehe Anhang), wird die Datei korrekt eingelesen, allerdings unvollständig, da sie zu viele Spalten hat. Also gilt es, das gleiche in R zu reproduzieren. Ich nehme dich mal mit auf meine Spurensuche, damit du verstehst was ich - als mäßig BegabteR (höhö) - getan habe.

Dafür gibt es die Funktion read.delim(). Eigentlich müsste es mit der Standardeinstellung für den Feldtrenner klappen, wenn ich die Hilfe richtig verstehe (vorweg: Wer lesen kann, ist klar im Vorteil - siehe unten.).
the field separator character. Values on each line of the file are separated by this character. If sep = "" (the default for read.table) the separator is ‘white space’, that is one or more spaces, tabs, newlines or carriage returns.
Allerdings klappt es bei mir damit noch nicht

Code: Alles auswählen

# Datei precip-mon einlesen
precipipation <- read.delim(file = "/home/mp/Schreibtisch/R-Forum/Wetterdaten/precip-mon.txt", sep = " ", header = TRUE, skip = 7, nrows = 10)

Fehler in read.table(file = file, header = header, sep = sep, quote = quote,  : 
  leerer Anfang der Datei
Zusätzlich: Es gab 12 Warnungen (Anzeige mit warnings())
> warnings()
Warnmeldungen:
1: In readLines(file, skip) : Zeile 1 scheint ein nul Zeichen zu enthalten
2: In readLines(file, skip) : Zeile 2 scheint ein nul Zeichen zu enthalten
3: In readLines(file, skip) : Zeile 3 scheint ein nul Zeichen zu enthalten
4: In readLines(file, skip) : Zeile 4 scheint ein nul Zeichen zu enthalten
5: In readLines(file, skip) : Zeile 5 scheint ein nul Zeichen zu enthalten
6: In readLines(file, skip) : Zeile 6 scheint ein nul Zeichen zu enthalten
7: In readLines(file, skip) : Zeile 7 scheint ein nul Zeichen zu enthalten
8: In read.table(file = file, header = header, sep = sep,  ... :
  line 1 appears to contain embedded nulls
9: In read.table(file = file, header = header, sep = sep,  ... :
  line 2 appears to contain embedded nulls
10: In read.table(file = file, header = header, sep = sep,  ... :
  line 3 appears to contain embedded nulls
11: In read.table(file = file, header = header, sep = sep,  ... :
  line 4 appears to contain embedded nulls
12: In read.table(file = file, header = header, sep = sep,  ... :
  line 5 appears to contain embedded nulls 
Mit ein bisschen googeln bin ich hierauf gestoßen (https://stackoverflow.com/questions/247 ... dded-nulls) - wenn ich das fileEncoding spezifiziere, tut R erst einmal was, gibt aber einen anderen Fehler aus.

Code: Alles auswählen

precipipation <- read.delim(file = "/home/mp/Schreibtisch/R-Forum/Wetterdaten/precip-mon.txt", sep = " ", header = TRUE, skip = 7, nrows = 10, fileEncoding= "UTF-16") 
Fehler in read.table(file = file, header = header, sep = sep, quote = quote,  : 
  mehr Spalten als Spaltennamen
Wenn ich behelfsmäßig die 8. Zeile mit den Spaltennamen auslasse, liest R die Datei ein. Mit str() sieht man, dass doppelte Leerzeichen nicht zusammengefasst wurden.

Code: Alles auswählen

precipipation <- read.delim(file = "/home/mp/Schreibtisch/R-Forum/Wetterdaten/precip-mon.txt", sep = " ", header = FALSE, skip = 8, nrows = 10, fileEncoding= "UTF-16") 

str(precipipation)
'data.frame':	11 obs. of  54799 variables:
 $ V1    : int  176512 176601 176602 176603 176604 176605 NA 176606 NA 176607 ...
 $ V2    : num  NA NA NA NA NA NA NA NA 0 NA ...
 $ V3    : num  NA NA NA NA NA NA 2.22 NA NA NA ...
 $ V4    : num  25.3 17.9 25.2 27.8 18.2 ...
 $ V5    : num  NA NA NA NA NA NA NA NA 0 NA ...
 $ V6    : logi  NA NA NA NA NA NA ...
 $ V7    : num  25.1 18 24.5 28.6 18.1 ...
 $ V8    : num  NA NA NA NA NA NA NA NA 0 NA ...
 $ V9    : logi  NA NA NA NA NA NA ...
 $ V10   : num  25.2 18 25.5 28.6 18 ...
 $ V11   : num  NA NA NA NA NA NA 9.61 NA 0 NA ...
 $ V12   : logi  NA NA NA NA NA NA ...
 $ V13   : num  25.1 18.1 25.6 29.4 17.9 ...
 $ V14   : num  NA NA NA NA NA NA NA NA 0 NA ...
 $ V15   : logi  NA NA NA NA NA NA ...
 $ V16   : num  26 19.1 26.6 30.5 18 ...
 $ V17   : num  NA NA NA NA NA NA NA NA 0 NA ...
 $ V18   : logi  NA NA NA NA NA NA ...
 $ V19   : num  25.9 19 26.7 30.3 18.9 ...
 $ V20   : num  NA NA NA NA NA NA NA NA 1.24 NA ...
 $ V21   : logi  NA NA NA NA NA NA ...
 $ V22   : num  26 19.2 26.6 31.4 18.8 ...
 $ V23   : logi  NA NA NA NA NA NA ...
 $ V24   : num  NA NA NA NA NA NA NA NA 1.25 NA ...
 $ V25   : num  25.9 19.2 27.6 31.4 18.8 ...
 $ V26   : logi  NA NA NA NA NA NA ...
 $ V27   : logi  NA NA NA NA NA NA ...
 $ V28   : num  26.1 20.3 27.6 NA 18.7 ...
 $ V29   : num  NA NA NA 31.3 NA ...
 $ V30   : logi  NA NA NA NA NA NA ...
 $ V31   : num  26.2 20.3 28.7 NA 18.8 ...
 $ V32   : num  NA NA NA 32.2 NA ...
 $ V33   : num  NA NA NA NA NA NA NA NA 3.85 NA ...
 $ V34   : num  26.2 20.4 28.7 NA 18.9 ...
 $ V35   : num  NA NA NA 32.2 NA ...
 $ V36   : logi  NA NA NA NA NA NA ...
 $ V37   : num  26.3 20.4 28.8 NA 19.7 ...
 $ V38   : num  NA NA NA 31.6 NA ...
 $ V39   : logi  NA NA NA NA NA NA ...
 $ V40   : num  26.3 NA 28.7 NA 19.9 ...
 $ V41   : num  NA 20.3 NA 32.6 NA ...
 $ V42   : logi  NA NA NA NA NA NA ...
 $ V43   : num  26.3 NA 29.9 NA 19.9 ...
 $ V44   : num  NA 21.3 NA 32.7 NA ...
 $ V45   : num  NA NA NA NA NA NA NA NA 1.7 NA ...
 $ V46   : num  26.3 NA 30 NA 20 ...
 $ V47   : num  NA 21.2 NA 33.7 NA ...
 $ V48   : logi  NA NA NA NA NA NA ...
 $ V49   : num  26.4 NA 30 NA 19.4 ...
 $ V50   : num  NA 21.3 NA 33.8 NA ...
 $ V51   : logi  NA NA NA NA NA NA ...
 $ V52   : num  26.4 NA 31.2 NA 19.5 ...
 $ V53   : num  NA NA NA 33.7 NA ...
 $ V54   : num  NA 22.3 NA NA NA ...
 $ V55   : num  26.5 NA 31.2 NA 19.5 ...
 $ V56   : num  NA NA NA 33.8 NA ...
 $ V57   : num  NA 22.4 NA NA NA ...
 $ V58   : num  26.4 NA 30.6 NA 20.5 ...
 $ V59   : num  NA NA NA 33.8 NA ...
 $ V60   : num  NA 22.5 NA NA NA ...
 $ V61   : num  25.4 NA 30.7 NA NA ...
 $ V62   : num  NA NA NA 33.7 19.6 ...
 $ V63   : num  NA 22.7 NA NA NA ...
 $ V64   : num  23.8 NA 29.8 NA NA ...
 $ V65   : num  NA NA NA 33.7 19.7 ...
 $ V66   : num  NA 21.8 NA NA NA ...
 $ V67   : num  24.8 NA 30.7 NA NA ...
 $ V68   : num  NA NA NA NA NA ...
 $ V69   : num  NA 23 NA 33.8 19.7 ...
 $ V70   : num  23.8 NA 29.7 NA NA ...
 $ V71   : num  NA NA NA NA NA ...
 $ V72   : num  NA 23 NA 33.8 19.9 ...
 $ V73   : num  23.8 NA 30.8 NA NA ...
 $ V74   : num  NA NA NA NA NA ...
 $ V75   : num  NA 23.1 NA 33.8 19.9 ...
 $ V76   : num  23.8 NA 30.8 NA NA ...
 $ V77   : num  NA NA NA NA NA ...
 $ V78   : num  NA 23.2 NA 33.8 20 ...
 $ V79   : num  23.9 NA 30.8 NA NA ...
 $ V80   : num  NA NA NA NA NA ...
 $ V81   : num  NA 23.3 NA 33.8 19.8 ...
 $ V82   : num  21.9 NA NA NA NA ...
 $ V83   : num  NA NA 28.8 NA NA ...
 $ V84   : num  NA 22.3 NA NA 19.9 ...
 $ V85   : num  21.9 NA NA 32.8 NA ...
 $ V86   : num  NA NA 28.8 NA NA ...
 $ V87   : num  NA 22.3 NA NA NA ...
 $ V88   : num  22.8 NA NA NA 20 ...
 $ V89   : num  NA NA 29.9 31.9 NA ...
 $ V90   : num  NA 23.3 NA NA NA ...
 $ V91   : num  22.9 NA NA NA 20 ...
 $ V92   : num  NA NA 30.1 32.9 NA ...
 $ V93   : num  NA 23.3 NA NA NA ...
 $ V94   : num  20.9 NA NA NA 20 ...
 $ V95   : num  NA NA 27.9 32.9 NA ...
 $ V96   : num  NA 22.3 NA NA NA ...
 $ V97   : num  20.9 NA NA NA 19 ...
 $ V98   : num  NA NA 28.1 32 NA ...
 $ V99   : num  NA 22.1 NA NA NA ...
  [list output truncated]
Also funktioniert sep nicht wie oben aus der Hilfe zitiert. Wieder googeln (https://stackoverflow.com/questions/169 ... miter-in-r):
You need to change your delimiter. " " refers to one whitespace character. "" refers to any length whitespace as being the delimiter
Und da sind wir bei dem Punkt wer lesen kann, ist klar im Vorteil. Tada (inklusive Spaltennamen):

Code: Alles auswählen

precipipation <- read.delim(file = "/home/mp/Schreibtisch/R-Forum/Wetterdaten/precip-mon.txt", sep = "", header = TRUE, skip = 7, nrows = 10, fileEncoding= "UTF-16") 

str(precipipation)
'data.frame':	10 obs. of  18001 variables:
 $ YYYYMM        : int  176512 176601 176602 176603 176604 176605 176606 176607 176608 176609
 $ X79.75N.49.75W: num  25.3 17.9 25.2 27.8 18.2 ...
 $ X79.75N.49.25W: num  25.1 18 24.5 28.6 18.1 ...
 $ X79.75N.48.75W: num  25.2 18 25.5 28.6 18 ...
 $ X79.75N.48.25W: num  25.1 18.1 25.6 29.4 17.9 ...
 $ X79.75N.47.75W: num  26 19.1 26.6 30.5 18 ...
 $ X79.75N.47.25W: num  25.9 19 26.7 30.3 18.9 ...
 $ X79.75N.46.75W: num  26 19.2 26.6 31.4 18.8 ...
 $ X79.75N.46.25W: num  25.9 19.2 27.6 31.4 18.8 ...
 $ X79.75N.45.75W: num  26.1 20.3 27.6 31.3 18.7 ...
 $ X79.75N.45.25W: num  26.2 20.3 28.7 32.2 18.8 ...
 $ X79.75N.44.75W: num  26.2 20.4 28.7 32.2 18.9 ...
 $ X79.75N.44.25W: num  26.3 20.4 28.8 31.6 19.7 ...
 $ X79.75N.43.75W: num  26.3 20.3 28.7 32.6 19.9 ...
 $ X79.75N.43.25W: num  26.3 21.3 29.9 32.7 19.9 ...
 $ X79.75N.42.75W: num  26.3 21.2 30 33.7 20 ...
 $ X79.75N.42.25W: num  26.4 21.3 30 33.8 19.4 ...
 $ X79.75N.41.75W: num  26.4 22.3 31.2 33.7 19.5 ...
 $ X79.75N.41.25W: num  26.5 22.4 31.2 33.8 19.5 ...
 $ X79.75N.40.75W: num  26.4 22.5 30.6 33.8 20.5 ...
 $ X79.75N.40.25W: num  25.4 22.7 30.7 33.7 19.6 ...
 $ X79.75N.39.75W: num  23.8 21.8 29.8 33.7 19.7 ...
 $ X79.75N.39.25W: num  24.8 23 30.7 33.8 19.7 ...
 $ X79.75N.38.75W: num  23.8 23 29.7 33.8 19.9 ...
 $ X79.75N.38.25W: num  23.8 23.1 30.8 33.8 19.9 ...
 $ X79.75N.37.75W: num  23.8 23.2 30.8 33.8 20 ...
 $ X79.75N.37.25W: num  23.9 23.3 30.8 33.8 19.8 ...
 $ X79.75N.36.75W: num  21.9 22.3 28.8 32.8 19.9 ...
 $ X79.75N.36.25W: num  21.9 22.3 28.8 31.9 20 ...
 $ X79.75N.35.75W: num  22.8 23.3 29.9 32.9 20 ...
 $ X79.75N.35.25W: num  22.9 23.3 30.1 32.9 20 ...
 $ X79.75N.34.75W: num  20.9 22.3 27.9 32 19 ...
 $ X79.75N.34.25W: num  20.9 22.1 28.1 30.9 19 ...
 $ X79.75N.33.75W: num  20.9 22.2 28.9 31.9 20.1 ...
 $ X79.75N.33.25W: num  21 22.3 28.1 31.8 20.1 ...
 $ X79.75N.32.75W: num  19.9 22.4 28.2 30.9 19.1 ...
 $ X79.75N.32.25W: num  19.9 21.2 26.6 29.9 19 ...
 $ X79.75N.31.75W: num  18.9 21.1 26.8 29.9 18.9 ...
 $ X79.75N.31.25W: num  19 21 25.9 29 18.8 ...
 $ X79.75N.30.75W: num  19 19.8 26 29.1 17.8 ...
 $ X79.75N.30.25W: num  17.9 18.8 23.9 26.9 17.7 ...
 $ X79.75N.29.75W: num  16.9 17.6 22.9 25.9 16.6 ...
 $ X79.75N.29.25W: num  16.1 17.6 21.9 25.1 15.6 ...
 $ X79.75N.28.75W: num  12 14.4 18.1 20.9 13.7 ...
 $ X79.75N.28.25W: num  13 14.4 18.9 21.1 13.6 ...
 $ X79.75N.27.75W: num  13 15.3 18.9 22.2 13.5 ...
 $ X79.75N.27.25W: num  14 15.3 19 22 13.3 ...
 $ X79.75N.26.75W: num  13 14.2 16.9 20 13.2 ...
 $ X79.75N.26.25W: num  12 13.2 16.1 19 12.3 ...
 $ X79.75N.25.75W: num  12.3 13.2 16.1 19.4 12.2 ...
 $ X79.75N.25.25W: num  12.2 13.2 16.2 19.3 12 ...
 $ X79.75N.24.75W: num  12.3 12.1 15.4 18.3 11.8 ...
 $ X79.75N.24.25W: num  11.4 11.1 13.2 17.5 10.8 ...
 $ X79.75N.23.75W: num  10.6 10.02 12.27 15.4 9.92 ...
 $ X79.75N.23.25W: num  11.3 10.5 12.3 15.7 10.8 ...
 $ X79.75N.22.75W: num  11.4 10.4 12.2 15.6 10.8 ...
 $ X79.75N.22.25W: num  11.4 10.3 11.3 15.6 10.7 ...
 $ X79.75N.21.75W: num  12.5 10.2 12.3 15.6 10.5 ...
 $ X79.75N.21.25W: num  14.5 11.1 14.2 17.8 12.1 ...
 $ X79.75N.20.75W: num  11.53 9.16 10.29 13.36 10.3 ...
 $ X79.75N.20.25W: num  11.43 8.12 10.32 13.5 10.24 ...
 $ X79.75N.19.75W: num  16.5 12.2 14.5 17.4 12.9 ...
 $ X79.75N.19.25W: num  19.8 15.3 16.5 19.7 13.7 ...
 $ X79.75N.18.75W: num  24.7 19.2 20.8 23.6 16.2 ...
 $ X79.75N.18.25W: num  29.2 23.1 23.8 26.6 17.9 ...
 $ X79.75N.17.75W: num  18.6 13 13.5 16.1 14.5 ...
 $ X79.75N.17.25W: logi  NA NA NA NA NA NA ...
 usw......
Jetzt könnte man die leeren Spalten löschen. So ganz einfach kann man mit der Datenstruktur auch noch nicht rechnen.
Dateianhänge
Einleseeinstellungen.png
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Probleme beim Einlesen von Daten

Beitrag von jogo »

Hallo Hufeisen,

große Klasse!
Damit auch andere Spaß damit haben:

Code: Alles auswählen

Prec <- read.delim("https://www1.ncdc.noaa.gov/pub/data/paleo/historical/europe/casty2007/precip-mon.txt", 
                  sep="", header=TRUE, skip=7, nrows=10, fileEncoding="UTF-16") 
Temp <- read.delim("https://www1.ncdc.noaa.gov/pub/data/paleo/historical/europe/casty2007/temp-mon.txt", 
                  sep="", header=TRUE, skip=7, nrows=10, fileEncoding="UTF-16")  
(für den großen Spaß muss die Zeilenbegrenzung nrow=10 weg)

Gruß, Jörg
Hufeisen
Beiträge: 162
Registriert: Fr Aug 31, 2018 6:34 pm

Re: Probleme beim Einlesen von Daten

Beitrag von Hufeisen »

Danke :D. Stimmt, das nrow war ein Behelf für den Anfang weil die Datei so groß ist.
FR1712
Beiträge: 17
Registriert: So Nov 11, 2018 11:23 pm

Re: Probleme beim Einlesen von Daten

Beitrag von FR1712 »

Hallo Hufeisen, hallo Jörg,

herzlichen Dank, es hat funktioniert. Ja, mit dem Lesen können ist das halt so eine Sache. Es ist ja nicht so, dass ich im Vorfeld dazu nicht gesucht und recherchiert hätte. Es ist im Prinzip schon daran gescheitert, zu erkennen, dass ich read.delim() verwenden sollte, obwohl ich mir die Beschreibungen der einzelnen Funktionen durchgelesen habe. Das war wohl zu oberflächlich, bzw. war ich zu schnell dabei, nach einer anderen Lösung zu recherchieren. Trotzdem glaube ich, dass ich von selbst auch nach einem Tag Recherche nicht auf diese Lösung gekommen wäre. Also wirklich danke dafür.

Beste Grüße,
Robert
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Probleme beim Einlesen von Daten

Beitrag von jogo »

Hallo Robert,

man hätte auch read.table() verwenden können - die anderen Funktionen sind nur speziell vorparametrisierte Versionen von read.table().
Wenn man read.delim() verwendet, kann man auf header=TRUE verzichten (ist Standardwert).

Gruß, Jörg
Hufeisen
Beiträge: 162
Registriert: Fr Aug 31, 2018 6:34 pm

Re: Probleme beim Einlesen von Daten

Beitrag von Hufeisen »

FR1712 hat geschrieben: Mi Aug 07, 2019 4:04 pmJa, mit dem Lesen können ist das halt so eine Sache.
Damit hier kein Missverständnis entsteht: Damit meinte ich mich, weil in der Hilfe explizit sep = "" steht und ich daraus sep = " " gemacht habe. Aber so ein Fehler passiert bestimmt jedem mal, deshalb habe ich das auch so in meinem Lösungsweg dokumentiert.

Viel Erfolg mit den Dateien!
Antworten