Ich habe so einen Datensatz:
%Vor%Nun möchte ich die Daten nach Daten gruppieren und den Wert der Klasse B von Klasse A subtrahieren. Ich schaute ddply, zusammenfassen, schmelzen und aggregieren, aber kann nicht ganz bekommen, was ich will. Gibt es einen Weg, es leicht zu machen? Beachten Sie, dass ich genau zwei Werte pro Datum habe, eins von Klasse A und eins von Klasse B. Ich meine, ich könnte es in zwei dfs ordnen nach Datum und Klasse ordnen und es wieder zusammenführen, aber ich denke, dass es mehr R gibt es zu tun.
Der einfachste Weg, den ich mir vorstellen kann, ist die Verwendung von dcast
aus dem Paket reshape2
, um einen Datenrahmen mit einem Datum pro Zeile und den Spalten A
und B
zu erstellen und dann transform
zu verwenden Mach A-B
:
Nehmen wir diesen Datenrahmen an (generiert wie in Prasads Beitrag, aber mit einem set.seed
für die Reproduzierbarkeit):
Dann betrachten wir sieben Lösungen:
1) zoo kann uns eine Ein-Zeilen-Lösung geben (ohne die library
-Anweisung):
gibt diese zoo
-Serie:
Beachten Sie auch, dass as.data.frame(z)
oder data.frame(time = time(z), value = coredata(z))
einen Datenrahmen ergibt; jedoch möchten Sie es möglicherweise als ein Zoo-Objekt belassen, da es eine Zeitreihe ist und andere Operationen in dieser Form, z. plot(z)
2) sqldf kann auch eine Lösung mit einer Aussage (abgesehen von% code_% Aufruf) geben:
%Vor%3) tapply kann als Grundlage für eine von der sqldf-Lösung inspirierte Lösung verwendet werden:
%Vor% 4) aggregate kann genauso verwendet werden wie library
und sqldf
oben (obwohl auch eine etwas andere Lösung auf Basis von tapply
bereits erschienen ist):
5) summaryBy aus dem DoBy-Paket kann eine weitere Lösung bereitstellen, obwohl es ein aggregate
benötigt, um es zu unterstützen:
6) Remix aus dem Remix-Paket kann es auch tun, aber mit einem transform
und bietet besonders schöne Ausgabe:
7) summary.formula im Hmisc-Paket hat auch schöne Ausgabe:
%Vor%