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,
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?
Wie wäre es mit
? %Vor%Wenn Sie bestimmte Spalten angeben müssen, können Sie
verwenden %Vor%oder
%Vor% 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.
Es kann auch für ausgewählte Spalten ausgeführt werden, d. h.
%Vor%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
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:
Machen Sie dann die Division durch Mitteloperation, auf jeder Gruppe:
%Vor%Dann zurück zum ursprünglichen Wide-Format:
%Vor%Tags und Links r data.table