Wie kann ich Funktionen verwenden, die Vektoren (wie fünfinum) mit ddply oder aggregat zurückliefern?

7

Ich möchte meinen Datenrahmen mit ein paar Spalten teilen und nennen wir fivenum für jede Gruppe.

%Vor%

Der zurückgegebene Wert ist ein Datenrahmen mit nur zwei Spalten und der zweite ist eine Matrix. Wie kann ich es in normale Spalten eines dat.frame verwandeln?

Aktualisieren

Ich möchte etwas wie das Folgende mit weniger Code mit fivenum

%Vor%     
mlt 07.02.2013, 18:42
quelle

4 Antworten

5

Sie können do.call verwenden, um data.frame für jedes Matrixelement rekursiv aufzurufen, um ein dat.frame mit Vektorelementen zu erhalten:

%Vor%     
James 07.02.2013, 19:38
quelle
9

Hier ist eine Lösung mit data.table (obwohl nicht ausdrücklich angefordert, ist es ein offensichtliches Kompliment oder ein Ersatz für aggregate oder ddply . Der Aufruf von quantile ist nicht nur ein wenig lang, sondern auch ineffizient , für jeden Anruf sortieren Sie die Daten

%Vor%

Oder verwenden Sie einen einzelnen Aufruf von quantile mit dem entsprechenden Argument prob .

%Vor%

Beachten Sie, dass die Namen der erstellten Spalten nicht syntaktisch gültig sind, obwohl Sie eine ähnliche Umbenennung mit setnames

durchführen könnten

BEARBEITEN

Interessanterweise wird quantile die Namen des resultierenden Vektors setzen, wenn Sie names = TRUE setzen, und dies wird kopieren (verlangsamen Sie die Zahlenverarbeitung und verbrauchen Speicher - es warnt Sie sogar in der Hilfe, Lust darauf!)

Daher sollten Sie wahrscheinlich

verwenden %Vor%

Oder wenn Sie die benannte Liste ohne R intern kopieren möchten

%Vor%     
mnel 11.02.2013 01:46
quelle
4

Soweit ich weiß, gibt es keinen genauen Weg, um das zu tun, was Sie fragen, weil die Funktion, die Sie verwenden (foznum), Daten nicht so zurückliefert, dass sie leicht an Spalten gebunden werden können innerhalb der "ddply" -Funktion. Dies ist jedoch auf programmatische Weise leicht zu bereinigen.

Schritt 1 : Führen Sie die fivenum Funktion für jeden 'Species' Wert mit der 'ddply' Funktion aus.

%Vor%

Nun gibt die Funktion 'funnum' eine Liste zurück, so dass wir für jede Spezies 5 Einträge erhalten. Das ist der Teil, wo die Fünf-Mann-Funktion gegen uns kämpft.

Schritt 2 : Fügen Sie eine Beschriftungsspalte hinzu. Wir wissen, was die fünf Zahlen von Tukey sind, also rufen wir sie einfach in der Reihenfolge auf, in der die Fünf-Zahlen-Funktion sie zurückgibt. Die Liste wird wiederholt, bis sie das Ende der Daten erreicht.

%Vor%

Schritt 3 : Wenn die Beschriftungen vorhanden sind, können wir diese Daten mithilfe der Funktion 'dcast' aus dem Paket 'reshape2' schnell in eine neue Form umwandeln.

%Vor%

Der ganze Kram am Ende gibt nur die Spaltenreihenfolge an, da die'cast '-Funktion die Dinge automatisch in alphabetischer Reihenfolge abbildet.

Hoffe, das hilft.

Update : Ich habe mich entschieden, zurückzukehren, weil mir klar geworden ist, dass Ihnen noch eine weitere Option zur Verfügung steht. Sie können eine Matrix immer als Teil einer Datenrahmendefinition binden, sodass Sie Ihre Aggregatfunktion wie folgt auflösen können:

%Vor%     
Dinre 07.02.2013 19:22
quelle
0

Das ist meine Lösung:

%Vor%     
pmjn6 04.10.2015 22:55
quelle

Tags und Links