Effizient die oberste Anzahl von Zeilen für jeden eindeutigen Wert einer Spalte in einem dat.frame auswählen

8

Ich versuche eine Teilmenge eines Datenrahmens basierend auf dem Auftreten eines Wertes zu nehmen. Dies wird am besten in einem unten angegebenen Beispiel erklärt. Diese Frage hat eine hohe Beziehung zu: Auswahl der obersten endlichen Anzahl von Zeilen für jeden eindeutigen Wert einer Spalte in einer Datenquelle in R Ich möchte jedoch die Anzahl der Elemente ändern, die mit dem Befehl head () ausgewählt wurden.

%Vor%

Ich hoffe, dass jemand einen besseren, effizienteren Weg kennt. Ich habe versucht, die Split-Funktion aus der Antwort hier zu verwenden: Auswahl der obersten endlichen Anzahl von Zeilen für jeden eindeutigen Wert einer Spalte in einer Datenberuhigung in R , um auf den Produkten zu teilen und dann zu versuchen, über sie zu iterieren und die Option auszuwählen Kopf(). Die Split-Funktion hat jedoch immer keinen Speicher mehr (kann nicht zugeordnet werden ..)

%Vor%

Also am Ende ist mein Problem, dass ich eine andere Menge jedes einzigartigen Produkts auswählen möchte. Also hier 2 Artikel von 1000001 und 1 Artikel von 1000002 und 1000003.

    
Freddy 17.10.2013, 10:55
quelle

2 Antworten

10

Zwei Lösungen fallen mir ein. plyr::ddply wurde für Ihre Bedürfnisse entwickelt, aber die Verwendung von data.table wird schneller durchgeführt.

Sie möchten ein data.frame in Blöcke aufteilen, entfernen Sie alle unteren 25% der Zeilen jedes Chunks, die nach Datum sortiert sind und rekombinieren in ein data.frame . Dies kann in einer einfachen Zeile erfolgen ...

%Vor%

data.table Lösung

Für data.table benötigen Sie die neueste Entwicklungsversion von r-forge (aufgrund des negativen Index nicht implementiert in der CRAN-Version der data.table noch nicht). Stellen Sie sicher, dass Sie dem Aufruf install.package folgen, um die neueste Version zu erhalten ...

%Vor%

Eine bessere Möglichkeit, data.table zu verwenden

Sie könnten dies leichter tun (Sie benötigen also keine Entwicklungsversion von data.table ) ...

%Vor%

Und Sie können auch lapply im Argument j verwenden (ich war besorgt über meine Verwendung von .SD ) und dies läuft in ~ 14 Sekunden auf einem data.table von 2e6 Zeilen mit 90.000 Produkten (Gruppen) ...

%Vor%

Update: Die beste Möglichkeit, data.table !

zu verwenden

Also dank @Arun (der jetzt ein Autor des data.table -Pakets ist) haben wir jetzt den besten Weg, data.table zu verwenden, was .I ist, was eine ganze Zahl ist vector aller Zeilenindizes, Untermenge in [ , indem die ersten 25% des Datensatzes mit -(1:ceiling(.N*.25)) entfernt werden und dann eine Teilmenge unter Verwendung dieser Zeilenindizes ausgeführt wird, um die finale Tabelle zu erhalten. Dies ist ~ 4-5 mal schneller als die Verwendung meiner .SD -Methode oben. Tolles Zeug!

%Vor%     
Simon O'Hanlon 17.10.2013, 11:49
quelle
2

Hier ist ein Weg mit mapply und Ihrem input und table_input :

%Vor%

Ich habe auch system.time und replicate aufgerufen, um die Geschwindigkeit von mapply und die Alternativen aus der Antwort von SimonO101 zu vergleichen:

%Vor%

ABER : Die Alternativen von SimonO101 machen nicht dasselbe wie mapply , weil ich mapply mit dem von Ihnen geposteten table_input verwendet habe; Ich weiß nicht, ob das im Vergleich eine Rolle spielt. Auch der Vergleich mag von mir doof gemacht worden sein. Ich habe es gerade wegen der Geschwindigkeitsproblematik gemacht, auf die Sie hingewiesen haben. Ich möchte, dass @ SimonO101 das sieht, falls ich Unsinn spreche.

    
alexis_laz 17.10.2013 14:17
quelle

Tags und Links