2015-04-17 14 views
5

im folgenden Datensatz würde Ich mag Wert in der Spalte multiplizieren Size von Wert in der Spalte Month1, Month2 oder Month3 je nachdem, welche Zahl wir Month in Spalte haben. Wenn also in einer bestimmten Zeile der Wert Month 2 ist, möchte ich den Wert in der Spalte Size mit dem Wert in der Spalte Month2 multiplizieren und das Ergebnis in der neuen Spalte NewSize speichern. Vielen Dank für Ihre Hilfe im Voraus!Multiplying Spaltenwert durch eine anderen Wert auf Wert in bestimmten Spalte R in Abhängigkeit

Orig = c("A","B","A","A","B","A","A","B","A") 
Dest = c("B","A","C","B","A","C","B","A","C") 
Month = c(1,1,1,2,2,2,3,3,3) 
Size = c(30,20,10,10,20,20,30,50,20) 
Month1 = c(1,0.2,0,1,0.2,0,1,0.2,0) 
Month2 = c(0.6,1,0,0.6,1,0,0.6,1,0) 
Month3 = c(0,1,0.6,0,1,0.6,0,1,0.6) 
df <- data.frame(Orig,Dest,Month,Size,Month1,Month2,Month3) 
df 

    Orig Dest Month Size Month1 Month2 Month3 
1 A B  1 30 1.0 0.6 0.0 
2 B A  1 20 0.2 1.0 1.0 
3 A C  1 10 0.0 0.0 0.6 
4 A B  2 10 1.0 0.6 0.0 
5 B A  2 20 0.2 1.0 1.0 
6 A C  2 20 0.0 0.0 0.6 
7 A B  3 30 1.0 0.6 0.0 
8 B A  3 50 0.2 1.0 1.0 
9 A C  3 20 0.0 0.0 0.6 

Antwort

1

Hier ist eine Alternative mit ifelse

> transform(df, NewSize=ifelse(Month==1, Size*Month1, 
        ifelse(Month==2, Size*Month2, Size*Month3))) 
    Orig Dest Month Size Month1 Month2 Month3 NewSize 
1 A B  1 30 1.0 0.6 0.0  30 
2 B A  1 20 0.2 1.0 1.0  4 
3 A C  1 10 0.0 0.0 0.6  0 
4 A B  2 10 1.0 0.6 0.0  6 
5 B A  2 20 0.2 1.0 1.0  20 
6 A C  2 20 0.0 0.0 0.6  0 
7 A B  3 30 1.0 0.6 0.0  0 
8 B A  3 50 0.2 1.0 1.0  50 
9 A C  3 20 0.0 0.0 0.6  12 
+1

perfekt, danke! – MIH

2

Hier ist, wie ich diese data.table mit Griff hatte.

require(data.table) 
setkey(setDT(df), 
     Month)[.(mon = 1:3),       ## i 
     NewSize := Size * get(paste0("Month", mon)), ## j 
     by=.EACHI]         ## by 
  • setDT wandelt df von data.frame zu data.table Bezug genommen wird.
  • setkey Nachbestellungen dass data.table durch die Spalte, Month, in aufsteigender Reihenfolge, und Markierungen, die Spalte als Schlüssel Säule, auf die wir eine Verknüpfung durchführen werden.
  • Wir führen eine Verknüpfung in der Schlüsselspalte im vorherigen Satz mit den Werten 1:3. Dies kann auch als Teilmenge Operation interpretiert werden, die alle Zeilen extrahiert, die 1,2 and 3 aus der Schlüsselspalte Month entsprechen. Für jeden Wert von 1:3 berechnen wir die übereinstimmenden Zeilen in i. Und für diese übereinstimmenden Zeilen berechnen wir NewSize, indem wir Size und MonthX für die übereinstimmenden Zeilen extrahieren und multiplizieren. Wir verwenden get(), um die richtige MonthX Spalte zu extrahieren.

  • by=.EACHI wie der Name impliziert, führt den Ausdruck in j für jeden i. Als Beispiel passt i=1 zu Zeilen 1: 3 von df. Für diese Zeilen extrahiert der j-Ausdruck Size = 30,20,10 und Month1 = 1.0, 0.2, 0.0, und es wird ausgewertet, um 30, 4, 0 zurückzugeben. Und dann für i=2 und so weiter ..

hoffe, das hilft ein wenig, auch wenn Sie suchen eine dplyr nur beantworten.

+0

vielen dank, das hilft sehr. müssen lernen "data.table" – MIH

1

Sie apply verwenden können:

apply(df, 1, function(u) as.numeric(u[paste0('Month', u['Month'])])*as.numeric(u['Size'])) 
#[1] 30 4 0 6 20 0 0 50 12 

Oder eine vektorisiert Lösung:

bool = matrix(rep(df$Month, each=3)==rep(1:3, nrow(df)), byrow=T, ncol=3) 

df[c('Month1', 'Month2', 'Month3')][bool] * df$Size 
#[1] 30 4 0 6 20 0 0 50 12 
1

In Basis R, voll vektorisiert:

df$Size*df[,5:7][cbind(1:nrow(df),df$Month)] 
Verwandte Themen