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