2017-10-13 9 views
1

Ich habe einen Datenrahmen mit mehreren Spalten mit unterschiedlichen Bereichen nach Ort. In einer anderen Spalte habe ich einen Dichtewert. Ich würde gerne wissen, wie man eine neue Tabelle (idealerweise durch eine Schleife) mit jedem Bereich multipliziert mit der Dichte erstellt. Meine Datenrahmen wie folgt aussieht:Multiplizieren Sie eine Anzahl von Spalten mit einer bestimmten Spalte

X Area1 Area2 Area3 Area4 Density 
A 10.1 12  20  25 0.04 
B 4.2  7.3 30  35 0.05 
C 5.3  9.6 10  15 0.07 
D 0.2  0.3 2  3  0.01 

Ich scheine eine ähnliche Frage an: Multiply many columns by a specific other column in R with data.table? aber keinen Weg finden, um es anzupassen für meine Daten zu arbeiten. Vielen Dank :)

+0

Wenn 'dt' ist Ihr * data.table *:' dt [, 2: 5: = lapply (.SD, '*', Dichte). SDcols = 2: 5] [] '? – Jaap

+0

@Jaap, alles, was sie tun müssen, ist eine Kopie, der Rest ist doppelt, nein? –

+1

@docendodiscimus ja, fügte aber eine Antwort hinzu, weil OP offensichtlich nicht klar war; Ich habe auch einen Link zur Standard 'copy' Frage hinzugefügt, die es imo kompletter macht – Jaap

Antwort

1

Wenn dt ist Ihr data.table dann

dtcopy <- copy(dt) 
dtcopy[, 2:5 := lapply(.SD, '*', Density), .SDcols = 2:5][] 

ergibt folgendes Ergebnis:

> dtcopy 
    X Area1 Area2 Area3 Area4 Density 
1: A 0.404 0.480 0.80 1.00 0.04 
2: B 0.210 0.365 1.50 1.75 0.05 
3: C 0.371 0.672 0.70 1.05 0.07 
4: D 0.002 0.003 0.02 0.03 0.01 

Während Ihrer ursprünglichen data.tabledt ist immer noch unverändert, weil Sie dieverwendet haben-function, um eine Kopie zu machen:

> dt 
    X Area1 Area2 Area3 Area4 Density 
1: A 10.1 12.0 20 25 0.04 
2: B 4.2 7.3 30 35 0.05 
3: C 5.3 9.6 10 15 0.07 
4: D 0.2 0.3  2  3 0.01 

Siehe auch Understanding exactly when a data.table is a reference to (vs a copy of) another data.table auf, warum Sie benötigen copy zu verwenden.


Gebrauchte Daten:

library(data.table) 
dt <- fread('X Area1 Area2 Area3 Area4 Density 
      A 10.1 12  20  25 0.04 
      B 4.2  7.3 30  35 0.05 
      C 5.3  9.6 10  15 0.07 
      D 0.2  0.3 2  3  0.01') 
+0

Danke. Darf ich Sie bitten zu klären, was die .SD- und .SDcols sind? – user3489562

+0

@ user3489562 '.SD' (und' .SDcols') steht für ** S ** ubset von ** D ** ata; Mit diesen Konzepten wird angegeben, auf welche Spalten die Funktion angewendet werden soll. In diesem Fall habe ich Spaltenpositionen dafür verwendet, aber Sie können auch Spaltennamen verwenden – Jaap

+0

ok, wenn ich verwende, was Sie vorgeschlagen habe, bekomme ich die folgende Fehlermeldung: unbenutztes Argument (. SDcols = 2: 5) – user3489562

Verwandte Themen