Daten nach Jahr aufteilen

8

Ich habe Daten wie folgt:

%Vor%

Ich möchte jetzt die Anzahl der verschiedenen IDs mit einem bestimmten Attribut pro Jahr zählen.

Ein Ergebnis könnte so aussehen:

%Vor%

I der zweite Schritt des Zählens der Vorkommen ist wahrscheinlich einfach.

Aber wie würde ich meine Daten in Jahre aufteilen?

Vielen Dank im Voraus!

    
speendo 24.10.2011, 08:10
quelle

5 Antworten

9

Hier ist ein Ansatz, der einige der Hadley-Pakete verwendet.

%Vor%

BEARBEITEN: Wenn das ursprüngliche data.frame groß ist, kann adply sehr viel Zeit in Anspruch nehmen. Eine sinnvolle Alternative in solchen Fällen ist die Verwendung des Pakets data.table . So können wir den adply -Aufruf mit data.table ersetzen.

%Vor%     
Ramnath 24.10.2011, 12:21
quelle
6

Hier ist eine Lösung, die nur den Kern von R verwendet. Zuerst zeigen wir die Eingabedaten, um das alles selbständig zu halten:

%Vor%

Nun, da wir die Eingabe haben, folgt die Lösung: yr ist definiert als eine Funktion, die das Jahr extrahiert. Der Kern der Berechnung ist die Aussage nach der Definition von yr . Für jede Zeile von DF erzeugt die anonyme Funktion einen Datenrahmen mit den Jahren, die in Spalte 1 und den ATTRIBUTE und ID in Spalten 2 und 3 überspannt sind. Zum Beispiel der Datenrahmen, der der ersten Zeile von% co_de entspricht % ist die 11 Zeile DF und der Datenrahmen, der der zweiten Zeile von data.frame(YEAR = 2000:2010, ATTRIBUTE = 1, ID = "A") entspricht, ist die zwei Zeilen DF . Die data.frame(YEAR = 2001:2002, ATTRIBUTE = 1, ID = "B") erzeugt eine Liste solcher Datenrahmen, einen für jede Zeile von lapply , so dass in der obigen Beispieleingabe eine Liste mit 4 Komponenten erzeugt wird. Unter Verwendung von DF we do.call der Komponenten dieser Liste, d. H. Der Individualdatenrahmen, wird ein einzelner großer Datenrahmen erzeugt. Wir eliminieren doppelte Zeilen (mit rbind ) aus diesem großen Datenrahmen, löschen die Spalte unique (die dritte Spalte) und führen ID für das Ergebnis aus:

%Vor%

Die resultierende Tabelle ist:

%Vor%

BEARBEITEN:

Poster hat später gezeigt, dass Speicher ein Problem sein könnte. Hier ist eine SQLF-Lösung, die die großen Zwischenergebnisse in SQLite außerhalb von R verarbeitet (die table sagt dies), also keine Speicherbeschränkung von R beeinflusse es. Es verwendet die gleiche Eingabe und die gleiche dbname = tempfile() -Funktion wie oben gezeigt und gibt das gleiche Ergebnis zurück, yr ist identisch mit tab oben. Probieren Sie es auch ohne out aus, falls es tatsächlich in den Speicher passt.

%Vor%     
G. Grothendieck 24.10.2011 17:38
quelle
2

Slighty verschachtelt, aber versuche das:

%Vor%

Was gibt:

%Vor%

Jetzt können wir die Tabelle erstellen:

%Vor%

Es zählt immer noch die IDs, aber es wäre wahrscheinlich einfacher, überlappende Bereiche in der ursprünglichen data.frame zusammenzufassen.

    
James 24.10.2011 10:19
quelle
2

Ich habe nicht die Absicht, hier eine Antwort zu geben, wie das Problem ein bisschen schwierig schien, so dass ich nur eine hässliche Lösung aus haben könnte, aber @Roman Luštrik Kommentar nach dem Lesen konnte ich diese Herausforderung nicht entziehen:)

Wie auch immer, ich bin mir nicht sicher, ob Ihnen diese Lösung gefallen wird, seien Sie also vorbereitet!

Laden Sie Ihre Demo-Daten:

%Vor%

Wir haben es nicht mit Monaten zu tun und halten das Jahr einfach in der Tabelle:

%Vor%

Doppelte Zeilen löschen (durch Zusammenführen von Jahren basierend auf ID und ATTRIBUTE ):

%Vor%

Und führe einen One-Liner mit einigen apply , lapply , do.call und Freunden aus, um die Schönheit von R zu zeigen! :)

%Vor%     
daroczig 24.10.2011 12:10
quelle
0

Danke für all eure Antworten!

Alle sind wirklich nett, aber einige fahren meinen Computer an seine Grenzen, weil ich wirklich große Datenmengen verarbeiten muss.

Ich habe schließlich alle Ihre Lösungen betrachtet und ein etwas anderes erstellt:

%Vor%

Der Nachteil ist, dass ich jede mögliche Form des Attributs definieren muss. Vielleicht gibt es eine Möglichkeit, dies automatisch zu tun, aber ich habe es noch nicht gefunden.

Die Geschwindigkeit dieser Lösung ist zumindest akzeptabel.

    
speendo 25.10.2011 14:25
quelle

Tags und Links