Multiplizieren Sie jede Zelle eines data.frame mit ihrem Gewicht

8

Was ich machen will ist peinlich einfach - trotzdem scheitere ich.

Ich habe einen Datenrahmen mit "Zeichen" und "Numerik". Eine der Spalten von data.frame repräsentiert die Gewichte.

Ich möchte jede Zelle des Datenrahmens mit dem entsprechenden Gewicht multiplizieren (wenn es eine Zahl ist).

Wie mache ich das (am besten ohne eine verschachtelte Schleife).

Vielen Dank im Voraus!

Beispiel:

%Vor%

sollte

werden %Vor%     
speendo 23.02.2011, 13:58
quelle

4 Antworten

6

Für ein reproduzierbares Beispiel ist dd ein Datenrahmen mit einer Mischung von Variablentypen, wobei W die Gewichtung ist.

%Vor%     
Aniko 23.02.2011, 14:08
quelle
5

Vektorisieren!

%Vor%

Effektiv möchten Sie c2 * w , aber wir müssen R sagen, innerhalb des Datenrahmens zu suchen:

%Vor%

Was wir in dat in einer einzelnen Zeile einfügen können:

%Vor%

(Ersetzen Sie c3 durch c2 , wenn Sie die vorhandene c2 überschreiben möchten.)

Wenn Sie mehr als eine numerische Spalte außer Gewichtung haben, ist eine leicht abweichende Strategie erforderlich, wenn Sie sie automatisieren möchten (d. h. R nicht mitteilen, welche Spalten mit w multipliziert werden sollen).

%Vor%     
Gavin Simpson 23.02.2011 14:07
quelle
2

Nur zum Vergnügen, es in einer Zeile zu machen (aber wirklich nicht am besten lesbar!):

%Vor%     
juba 23.02.2011 14:23
quelle
1

Wie Sie gesehen haben, gibt es eine Reihe von Möglichkeiten, dies zu tun, aber irgendwie würden Sie einen wirklich einfachen Weg erwarten und ich weiß nicht, ob das existiert. Es gibt eine Bibliotheksfunktion im plyr-Paket namens colwise, die nah ist, aber ich kann keinen sauberen Weg finden, um genau das zu erreichen, was Sie wollen. Das Beste, was ich mit colwise tun kann, ist dies (vorausgesetzt, Ihr Datenrahmen heißt df): %pr_e%

w2 & lt; -df $ w df & lt; -colwise (Funktion (x, w) {if (is.numeric (x)) {x * w} sonst {x}}) (df, df $ w) df $ w & lt; -w2

Für diejenigen, die mit colwise vertraut sind, glaube ich nicht, dass Sie einfach numcolwise verwenden können, weil dann die nicht numerischen Spalten überhaupt nicht ausgegeben werden. Und ich kann keinen sauberen Weg finden, die Multiplikation nicht auf das Gewicht anzuwenden, weshalb ich sie hier einfach speichere und wiederherstelle. Ich denke, wenn ein sauberer Weg dies zu tun ist, ist colwise eine schöne simple und einfach zu verstehende Art, dies zu tun.

    
frankc 23.02.2011 20:25
quelle

Tags und Links