Hallo mango,
hoffentlich hast Du das jetzt nicht falsch aufgefasst, das täte mir Leid. Wir hatten kurz das Thema "Big Data", weil das so im Thread-Titel steht und ich nachgefragt habe, ob wir da was beachten müssen. Big Data ist ja nirgends scharf definiert. Eine verbreitete Definition ist "wenn's nicht mehr in den RAM passt". Für mich ist Big Data, wenn man nach neuen und anderen Algorithmen suchen muss, als in der üblichen Datenverarbeitung.
Falls das missverstanden worden ist: Ich habe Dir keine schlechte Programmierung vorgeworfen und auch nicht behauptet, Dein Code wäre ineffizient. Im Gegenteil: ich habe Deinen Code zur Bekräftigung meiner Argumentation gemacht: Wenn Du jetzt Angst um RAM und Rechenzeit gehabt hättest, dann hättest Du bestimmt erstmal nur einen Dummy erstellt, damit die Statistik gerechnet, diesen Dummy dem Garbage Collector übergeben und dann einen neuen Dummy für die nächste Rechnung gemacht. Wenn Du von ganz großen Datenmengen ausgegangen wärest, dann hättest Du die Daten vielleicht nicht selbstverständlich in einem Vektor vermutet, sondern in einer Datenbank und hättest die Auswahl der Daten vielleicht über SQL geregelt und wenn Du richtig big big data vermutet hättest, dann hättest Du über verteiltes Rechnen oder MapReduce nachgedacht. Hast Du aber nicht, weil Du, wie ich auch, der Meinung bist, dass man diese Datenmengen für einfache Operationen wie Mittelwerte und Standardabweichungen mühelos im RAM handeln kann. Es war also nicht als Vorwurf gemeint sondern als Ausdruck unserer Einigkeit. Letztlich ist die Diskussion über den Begriff Big Data hier aber fruchtlos.
Natürlich ändert sich das mit der Handhabbarkeit der Daten ganz schnell, wenn man von den 10-sekündigen Daten aus mehreren Jahren nicht mehr den Mittelwert berechnen will, sondern für eine Clusteranalyse eine Distanzmatrix errechnen will. Dann lassen sich diese Datenmengen nicht mehr so einfach mit unseren Mitteln handhaben. Da reicht bestimmt auch Rechnen über Nacht nicht. Deshalb sage ich ja, dass erst geklärt werden muss, welche Art von Auswertung denn ansteht.
Nur auf Deine Nachfrage hin: Wenn man Deinen Code wirklich noch schneller machen müsste, wäre vielleicht data.table eine Idee. Ich bin da nicht firm drin, aber das ist in vielen Fällen wirklich viel schneller als klassische R-Datenstrukturen. Sonst müsste man entweder kleinteilig von Code-Abschnitten Alternativen suchen und prüfen, welche davon schneller sind oder nach Flaschenhälsen suchen, die man ggf. in C++ auslagert.
- Code: Alles auswählen
which( data_filter[[Dummy]]==1 )
könnte man wahrscheinlich beispielsweise durch
- Code: Alles auswählen
as.logical(data_filter[[Dummy]])
ersetzen und sich so den vielfachen Aufruf von '==' und von which() sparen und durch das hoffentlich sehr simple und schnelle as.logical() ersetzten, aber ob das jetzt wirklich viel bewegt oder Quatsch ist, müsste man messen. Deine Schreibweise ist in jedem Fall lesbarer.
Ansonsten hätte ich vorgeschlagen, mean() mit dem Argument na.rm=TRUE aufzurufen, denn in so einem großen Datensatz gibt es sehr wahrscheinlich NAs und mit Standardargumenten bringt mean() dann kein Ergebnis. Nochmal: Ich finde den Code gut so wie er ist
Viele liebe Grüße,
Bernhard