Vektor von Zahlen und Index in data.table

8

Was ist der beste Weg, um den folgenden Vektor in eine data.table zusammen mit dem Index jeder Zahl zu bekommen?

%Vor%

Hier ist was ich habe, gibt es einen besseren Weg?

%Vor%

Hinweis: Die Länge des Vektors beträgt etwa 125k und es gibt ~ 20 Millionen Werte.

    
mrp 22.12.2015, 19:29
quelle

2 Antworten

9

Warum nicht einfach:

%Vor%

Alternativ können Sie eine Funktion wie die folgende erstellen (die Verwendung einer Funktion ist mehr für die bequeme Wiederverwendung - nicht notwendig, wenn es nur ein einmaliges Problem ist):

%Vor%

Beachten Sie, dass die Verwendung von fixed = TRUE Ihnen eine gute Geschwindigkeitssteigerung geben wird - Sie sollten dies also auch im "data.table" -Ansatz berücksichtigen.

Schließlich, wie @Jaap vorschlägt, können Sie cSplit aus meinem "splitstapshape" -Paket verwenden, wie folgt:

%Vor%

Aktualisieren

Da die Leistung in Anbetracht der Größe Ihrer Daten ein Problem darstellt, möchten Sie möglicherweise die Methode fun verwenden, in der Sie die "data.table" manuell erstellen.

Hier ist ein Timing für eine größere Version Ihres Vektors:

%Vor%

Aktualisierung: 28. Dezember 2017

Die Leistung von diesen hängt wahrscheinlich zumindest teilweise von der Anzahl der resultierenden Split-Stücke ab, also dachte ich, ich würde:

  • Aktualisieren Sie die Antwort mit einigen unregelmäßigen Daten
  • Fügen Sie weitere Optionen hinzu, insbesondere:
    • Eine alternative R-Methode
    • Eine Alternative zu fun mit stringi
    • Ein möglicher "säuberlicher" Ansatz

Hier sind die neuen Beispieldaten:

%Vor%

Hier sind die neuen Funktionen:

%Vor%

Und das neue Benchmarking:

%Vor%

Wenn Sie die Daten weiter vergrößern, um näher an die Simulation Ihres tatsächlichen Datasets zu kommen, beginnt die Performance wirklich zu konvergieren - mit Ausnahme von "splitstapshape", das sich schrecklich verlangsamt: - (

Hier ist ein Beispiel:

%Vor%

An diesem Punkt und unter der Annahme, dass es unwahrscheinlich ist, dass Sie dies wiederholt tun, sollte eine der Optionen ziemlich anständig sein, um sie tatsächlich zu verwenden. Ich war persönlich überrascht, dass stack alle anderen Optionen übertroffen hat ....

    
A5C1D2H2I1M1N2O1R2T1 22.12.2015, 19:36
quelle
0

Vereinbart, dass Ananda Antwort ist groß, aber hier ist ein wenig mehr Brute-forcish Weg, um darüber zu gehen, um das stringr Paket und data.frames für zukünftige Extrapolation.

%Vor%     
Nancy 22.12.2015 19:54
quelle

Tags und Links