Mehrere data.table-Spalten elegant aktualisieren [duplizieren]

8

Ich versuche eine einfache Sache zu machen, dividiere 40 Spalten einer data.table nach ihrem Mittelwert. Ich kann die tatsächlichen Daten nicht bereitstellen (nicht alle Spalten sind numerisch, und ich habe & gt; 8M Zeilen), aber hier ist ein Beispiel:

%Vor%

Als nächstes dachte ich, ich würde tun:

%Vor%

Dies gibt jedoch einen Fehler zurück, da dt[,col] erfordert, dass Spaltennamen nicht zitiert werden. Die Verwendung von as.name(col) schneidet nicht ab. Jetzt,

%Vor%

enthält das expuded-Ergebnis, aber ich kann es nicht zurück in die data.table einfügen, wie

%Vor%

funktioniert nicht, auch dt[,1:40:=res, with=F] nicht.

Folgendes funktioniert, aber ich finde es ziemlich hässlich:

%Vor%

Sicher, ich könnte auch eine neue data.table neu erstellen, indem ich data.table() auf res und die anderen nicht-numerischen Spalten meiner data.table aufruft, aber ist das nicht effizienter?

    
jeanlain 09.06.2016, 08:36
quelle

4 Antworten

20

Wie wäre es mit

? %Vor%

Wenn Sie bestimmte Spalten angeben müssen, können Sie

verwenden %Vor%

oder

%Vor%     
docendo discimus 09.06.2016, 08:43
quelle
3

Wir können auch set verwenden. In diesem Fall sollte kein Unterschied zur Verwendung von [.data.table zusammen mit := bestehen. In Szenarios, in denen [.data.table jedoch mehrmals aufgerufen werden muss, wird mit set() vermieden, dass Overhead und könnten merkbar schneller sein.

%Vor%

Es kann auch für ausgewählte Spalten ausgeführt werden, d. h.

%Vor%

Daten

%Vor%     
akrun 09.06.2016 08:45
quelle
3

dplyr 0.4.3

Um alle Spalten nach ihrem Mittelwert zu teilen, könnten Sie Folgendes tun:

%Vor%

Oder um Spaltenpositionen anzugeben:

%Vor%

Oder Spaltennamen:

%Vor%

dplyr 0.4.3.9000

Wenn Sie nur numerische Spalten teilen möchten, hat die devel-Version von dplyr mutate_if , was für Spalten gilt, für die ein Vergleichselement TRUE

zurückgibt %Vor%     
Steven Beaupré 09.06.2016 10:01
quelle
1

Wie wäre es mit ein bisschen melt und dcast magic? Dies konvertiert die Daten in ein "langes" Format und dann wieder in das ursprüngliche "Wide".

Erstens, melt die Variable für eine ID:

%Vor%

Machen Sie dann die Division durch Mitteloperation, auf jeder Gruppe:

%Vor%

Dann zurück zum ursprünglichen Wide-Format:

%Vor%     
Ken Benoit 09.06.2016 09:00
quelle

Tags und Links