Ich verwende den folgenden Code, um meine Daten nach Compound, Replicate und Mass zusammenzufassen.
%Vor%Ein unglücklicher Nebeneffekt ist, dass der resultierende Datenrahmen nach diesen Feldern sortiert ist. Ich würde dies gerne tun und Compound, Replicate und Mass in der gleichen Reihenfolge wie im ursprünglichen Datenrahmen behalten. Irgendwelche Ideen? Ich habe versucht, eine "Sortierung" Spalte von sequentiellen Ganzzahlen zu den Originaldaten hinzuzufügen, aber natürlich kann ich das nicht in die .variables aufnehmen, da ich nicht nach "gruppieren" möchte, und so wird es nicht in der zurückgegeben summaryDataFrame.
Danke für die Hilfe.
Dies ist vor einiger Zeit auf der Mailingliste plyr
aufgetaucht (von @kohske nicht weniger angesprochen) und dies ist eine Lösung, die Peter Meilstrup für begrenzte Fälle anbietet:
Lesen Sie den Thread für Hadleys Notizen darüber, warum diese Funktionalität möglicherweise nicht allgemein genug ist, um in ddply
zu rollen, zumal es wahrscheinlich in Ihrem Fall zutrifft, da Sie mit jedem Stück wahrscheinlich weniger Zeilen zurückgeben.
Bearbeitet, um eine Strategie für allgemeinere Fälle einzufügen
Wenn ddply
etwas ausgibt, das in einer Reihenfolge sortiert ist, die Sie nicht mögen, haben Sie im Grunde zwei Möglichkeiten: Geben Sie die gewünschte Reihenfolge der aufspaltenden Variablen vorher mit geordneten Faktoren an oder sortieren Sie die Ausgabe nach dem Fakt.
Betrachten Sie zum Beispiel die folgenden Daten:
%Vor% mit Strings, für jetzt. ddply
sortiert die Ausgabe, was in diesem Fall die lexikalische Standardreihenfolge zur Folge hat:
Wenn der resultierende Datenrahmen nicht in der "richtigen" Reihenfolge endet, liegt das wahrscheinlich daran, dass Sie wirklich möchten, dass einige dieser Variablen geordnete Faktoren sind. Angenommen, wir wollten wirklich x1
und x2
so bestellen:
Wenn wir nun ddply
verwenden, wird die resultierende Sortierung wie folgt aussehen:
Die Moral der Geschichte hier ist, dass, wenn ddply
etwas in einer Reihenfolge ausgibt, die Sie nicht vorhatten, es ein gutes Zeichen ist, dass Sie geordnete Faktoren für die Variablen verwenden sollten, auf die Sie aufteilen.
Schließlich fügte ich dem ursprünglichen Datenrahmen eine "Indexierungs" -Spalte hinzu. Es bestand aus zwei Spalten pasted
mit sep="_"
. Dann habe ich einen weiteren Datenrahmen gemacht, der nur aus unique
Mitgliedern der Spalte 'indexing' und einem Counter 1:length(df)
besteht. Ich habe meine ddply()
auf die Daten angewendet, die einen sortierten Datenrahmen zurückgegeben haben. Um dann die Dinge in der ursprünglichen Reihenfolge zurück zu bekommen, habe ich merge()
den Ergebnisdatenrahmen und den Indexdatenrahmen gemacht (um sicherzustellen, dass die Spalten das gleiche genannt werden, macht dies das leichter). Schließlich habe ich order
und entfernte die überflüssigen Spalten.
Keine elegante Lösung, aber eine, die funktioniert.
Danke für die Hilfe. Es brachte mich dazu, in die richtige Richtung zu denken.