Wie ddply () ohne Sortieren?

8

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.

    
James 29.08.2011, 20:16
quelle

2 Antworten

11

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:

%Vor%

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:

%Vor%

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:

%Vor%

Wenn wir nun ddply verwenden, wird die resultierende Sortierung wie folgt aussehen:

%Vor%

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.

>     
joran 29.08.2011, 20:30
quelle
1

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.

    
James 30.08.2011 15:57
quelle

Tags und Links