Ich möchte einen Datenrahmen nach Zeitintervall aggregieren, indem ich für jede Spalte eine andere Funktion anwende. Ich glaube ich habe fast aggregate
runter, und habe meine Daten in Intervalle mit dem chron
Paket aufgeteilt, was einfach genug war.R: Aggregat mit spaltenspezifischer Funktion
Aber ich bin mir nicht sicher, wie die Teilmengen zu verarbeiten sind. Alle Zuordnungsfunktionen, *apply
, *ply
, nehmen eine Funktion an (ich hatte auf etwas gehofft, das einen Vektor von Funktionen pro Spalte oder -variable anwendete, aber keinen gefunden hatte), also schreibe ich eine Funktion, die benötigt meine Datenrahmen-Teilmengen, und gibt mir den Mittelwert für alle Variablen, außer "Zeit", die der Index ist, und "Runoff", die die Summe sein sollte.
Ich versuchte dies:
aggregate(d., list(Time=trunc(d.$time, "00:10:00")), function (dat) with(dat,
list(Time=time[1], mean(Port.1), mean(Port.1.1), mean(Port.2), mean(Port.2.1),
mean(Port.3), mean(Port.3.1), mean(Port.4), mean(Port.4.1), Runoff=sum(Port.5))))
, die genug, um selbst hässlich wäre, wenn es nicht mir diesen Fehler gegeben hat:
Error in eval(substitute(expr), data, enclos = parent.frame()) :
not that many frames on the stack
die mich tun erzählt Ich bin wirklich etwas falsch gemacht. Von dem, was ich von R gesehen habe, denke ich, dass es einen eleganten Weg dafür geben muss, aber was ist es?
dput:
d. <- structure(list(time = structure(c(15030.5520833333, 15030.5555555556,
15030.5590277778, 15030.5625, 15030.5659722222), format = structure(c("m/d/y",
"h:m:s"), .Names = c("dates", "times")), origin = structure(c(1,
1, 1970), .Names = c("month", "day", "year")), class = c("chron",
"dates", "times")), Port.1 = c(0.359747, 0.418139, 0.417459,
0.418139, 0.417459), Port.1.1 = c(1.3, 11.8, 11.9, 12, 12.1),
Port.2 = c(0.288837, 0.335544, 0.335544, 0.335544, 0.335544
), Port.2.1 = c(2.3, 13, 13.2, 13.3, 13.4), Port.3 = c(0.253942,
0.358257, 0.358257, 0.358257, 0.359002), Port.3.1 = c(2,
12.6, 12.7, 12.9, 13.1), Port.4 = c(0.352269, 0.410609, 0.410609,
0.410609, 0.410609), Port.4.1 = c(5.9, 17.5, 17.6, 17.7,
17.9), Port.5 = c(0L, 0L, 0L, 0L, 0L)), .Names = c("time",
"Port.1", "Port.1.1", "Port.2", "Port.2.1", "Port.3", "Port.3.1",
"Port.4", "Port.4.1", "Port.5"), row.names = c(NA, 5L), class = "data.frame")
Okay, ich denke ich verstehe das ein bisschen besser. Ich bin an stark typisierte Sprachen gewöhnt und finde das Klassenzwangsschema von R verwirrend. Ich würde auch gerne wissen, ob es einen einfachen Weg gibt, den Mittelwert der meisten Spalten zu nehmen, sondern einen speziell zu behandeln, ohne es explizit zu machen. Muss ich das df trennen und dann die Spalten neu kombinieren? – scry