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.
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 ...
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 ...
data.table
zu verwenden
Sie könnten dies leichter tun (Sie benötigen also keine Entwicklungsversion von data.table
) ...
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) ...
data.table
! 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!
Hier ist ein Weg mit mapply
und Ihrem input
und table_input
:
Ich habe auch system.time
und replicate
aufgerufen, um die Geschwindigkeit von mapply
und die Alternativen aus der Antwort von SimonO101 zu vergleichen:
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.