Benutzer-Werkzeuge

Webseiten-Werkzeuge


programmieren:r:messwertebeispiel

Messwertebeispiel

In nicht allzu ferner Zukunft werden Sie sich an Ihre Diplomarbeit heranwagen. Dazu werden Sie möglicherweise Versuche anstellen und dabei eine Menge Messungen vornehmen. Sie können die Messergebnisse natürlich in ein Notizbuch notieren. Allerdings gibt es auch Versuche, wo Sie dafür Tag und Nacht im Labor stehen, oder die anfallenden Messwerte sehr, sehr, sehr schnell abschreiben müssen.

Ein realistisches Szenario ist allerdings auch, dass die Messgeräte die Ergebnisse direkt in Dateien schreiben. Dieses Szenario werden Sie mit einiger Sicherheit auch in Ihrem späteren beruflichen Umfeld vorfinden.

Skriptsprachen, Programmierung, Automatisierung:

Dazu folgendes Modellbeispiel mit "R":

Im wirklichen Leben würde uns ein Messgerät Messergebnisse in eine Datei schreiben. Da wir hier im Unterricht keine Messgeräte haben, simulieren wir diese Messwerte einfach mit Zufallszahlen:

Die Funktion rnorm() erzeugt normalverteilte Zufallszahlen ( random numbers)

Beispiel: 100 normalverteilte Zufallszahlen mit Mittelwert 50 und Standardabweichung 3

rnorm( 100, mean = 50, sd = 3)

Erstellen Sie mittels Windows-Explorer im Ordner 'eigene R-Dateien' einen Unterordner namens 'Messergebnisse'. In diesem Ordner 'Messergebnisse' sollen sich dann einige Dateien mit (simulierten) Messergebnissen befinden.

Wechseln Sie in der R-Console mittels setwd() zu diesem Ordner 'Messergebnisse'.

write.csv2(  rnorm(100, 50, 3),  "messdaten1.csv",  row.names=FALSE ) 

erzeugt einen Vektor mit 100 normalverteilten Zufallszahlen und schreibt diese Zahlen im aktuellen Arbeitsverzeichnis (working directory) in die Datei 'messdaten1.csv'.

Sehen Sie im Explorer nach, ob die Datei tatsächlich vorhanden ist:

Sie können diese Datei entweder mit einem Tabellenkalkulationsprogramm oder einem Editor öffnen und bearbeiten.

Wiederholungsfrage:  das CSV-Dateiformat ist ein Binärformat  das CSV-Dateiformat ist ein Textformat

Nun benötigen wir ca. 25 solcher Dateien mit (simulierten) Messergebnissen.

	> write.csv2(  rnorm(100, 50, 3),  "messdaten1.csv",  row.names=FALSE )
	> write.csv2(  rnorm(100, 50, 3),  "messdaten2.csv",  row.names=FALSE )
	> write.csv2(  rnorm(100, 50, 3),  "messdaten3.csv",  row.names=FALSE )
	> write.csv2(  rnorm(100, 50, 3),  "messdaten4.csv",  row.names=FALSE )
	> write.csv2(  rnorm(100, 50, 3),  "messdaten5.csv",  row.names=FALSE )
	> write.csv2(  rnorm(100, 50, 3),  "messdaten6.csv",  row.names=FALSE )
	> write.csv2(  rnorm(100, 50, 3),  "messdaten7.csv",  row.names=FALSE )
	> write.csv2(  rnorm(100, 50, 3),  "messdaten8.csv",  row.names=FALSE )
	> write.csv2(  rnorm(100, 50, 3),  "messdaten9.csv",  row.names=FALSE )
	> write.csv2(  rnorm(100, 50, 3),  "messdaten10.csv",  row.names=FALSE )
	>                                         .... 
	>                                         .... 
	> write.csv2(  rnorm(100, 50, 3),  "messdaten24.csv",  row.names=FALSE )
	> write.csv2(  rnorm(100, 50, 3),  "messdaten25.csv",  row.names=FALSE )

oder

for (i in 1:25) {
	      dateiname=paste( "messdaten", i, ".csv", sep="" )
	      cat( "\n Datei ", dateiname, " wird geschrieben" )
	      write.csv2( rnorm(100, 50, 3), dateiname, row.names=FALSE )
	      }

Die zweite Methode schaut auf den ersten Blick mühsam aus, bei 100 oder 500 oder 1000 Dateien ist sie aber mit Sicherheit schneller und fehlerfreier und wesentlich müheloser … .

Wie funktioniert Sie?

Wir bauen eine Schleife: Die for-Schliefe arbeitet den Vektor 1:25 ab, und weist bei jedem Schleifendurchlauf der Variablen i einen neuen Wert zu. Dann wird der Anweisungsblock in den geschwungenen Klammern ausgeführt. Hier im Beispiel lassen wir uns die Werte von i anzeigen:

	for (i in 1:25) {
	      cat("\n", i)
	      }

Wie nützen wir das? Wir bauen aus dem i einen geeigneten Dateinamen. Beispiel:

	i <-17 
	dateiname=paste("messdaten", i, ".csv", sep="")

Und statt einem fixen i erzeugen wir in der for-Schleife einfach i's von 1 bis 25 … . Voilà!

Überzeugen Sie sich im Explorer, dass die Dateien angelegt wurden.

In R liefert die Funktion dir() einen Vektor mit den Namen der Dateien im Arbeits¬verzeichnis.

Die eigentliche Aufgabe lautet nun, die Dateien, die das (simulierte) Messgerät angelegt hat, automatisiert einzulesen und statistisch auszuwerten. Nochmals: Natürlich können Sie alle CSV-Dateien auch einzeln mittels Doppelklick in Excel öffnen und die entsprechenden Berechnungen durchführen. Bei einer Handvoll Dateien ist das auch absolut sinnvoll. Wir gehen aber nun davon aus, dass die Messgeräte Hunderte oder sogar Tausende solcher Dateien produziert haben. Oder dass in Ihrem Arbeitsumfeld Tag für Tag, Monat für Monat, Jahr für Jahr, solche Dateien anfallen, sodass Sie irgendwann einmal diese geistlose Tätigkeit automatisieren möchten.

Messergebnisse_verarbeiten <- function() {
 
Dateiliste <- dir(pattern=glob2rx("*.csv"))
 
for (aktuellerDateiname in Dateiliste) {
 
	cat( aktuellerDateiname, "wird eingelesen, ");
 
	aktuellerDateiinhalt <- read.csv2(aktuellerDateiname); 
 
	cat("Mittelwert:", mean(aktuellerDateiinhalt$x), "\n")
 
	}
 
}

Zur Wiederholung: Bearbeiten einer Funktion mit fix() z.B. fix(Messergebnisse_verarbeiten)

dir(pattern=glob2rx("*.csv"))

schränkt, wie leicht zu erraten ist, die Auflistung auf CSV-Dateien ein.

Ausführen der selbstentwickelten Funktion:

 Messergebnisse_verarbeiten() 

Tatsächlich, die Messdaten werden nun automatisiert eingelesen und statistisch verarbeitet, egal, ob es sich um Hunderte oder Tausende solcher Dateien handelt.

Fehlt nur noch, dass die Zwischenergebnisse nicht nur auf den Bildschirm geschrieben, sondern in einer Ausgabedatei zusammengefasst werden.

Hier die "Luxus"-Version mit ausführlicher Ausgabe:

Messergebnisse_verarbeiten <- function() {
 
Gesamt=data.frame()
i=0
 
Dateiliste <- dir(pattern=glob2rx("*.csv"))
 
for(aktuellerDateiname in Dateiliste) {
	i <- i + 1
	cat( "(", i, ")", aktuellerDateiname, "wird eingelesen, ");
 
	aktuellerDateiinhalt <- read.csv2(aktuellerDateiname); 
 
	cat("Mittelwert:", mean(aktuellerDateiinhalt$x), "\n")
 
	Gesamt[i,1]=aktuellerDateiname
	Gesamt[i,2]=mean(aktuellerDateiinhalt$x)
 
	}
 
names(Gesamt)<-c("Dateiname", "Mittelwert")
write.xls(Gesamt, "Gesamt.xls")
cat("-----\n", i, "Dateien wurden verarbeitet, Gesamtergebnis wurde in Datei Gesamt.xls geschrieben.\n")
}

Benützen Sie die Hilfe für Informationen zu den einzelnen Funktionen.

Dieses Beispiel können Sie als Grundgerüst nehmen und an Ihre jeweilige Aufgabestellung anpassen.

programmieren/r/messwertebeispiel.txt · Zuletzt geändert: 2016-04-15 10:57 von Robert Wiedermann

Seiten-Werkzeuge

Robert Wiedermann, Institut für Statistik (STAT), Universität für Bodenkultur Wien