2017-01-18 7 views
3

Ich habe ein Problem, wo ich geschätzte Wachstumsraten auf Basiszahlen multiplizieren muss. Die Wachstumsraten sind in einer Matrix gespeichert (siehe Datenbeispiel unten) und so sind die Basiszahlen. Das ist einfach - das Problem ist, dass ich mehrere Wachstumsraten für mehrere Arten von Entitäten hinter den Basiszahlen habe.For-Schleife innerhalb einer If-Anweisung in R

set.seed(1223) 
Typ1.rates <- c(1.1,1.2,0.9,1.4) 
Typ2.rates <- c(1.4,5.2,1.9,0.4) 
g.rates <- t(cbind(Typ1.rates, Typ2.rates)) 


x <- as.data.frame(matrix(rexp(16, rate=.2), ncol=4)*100) 
x$Type <- c(1,1,1,2) 

Also, wenn der Typ == 1 für eine bestimmte Zeile, ich die erste Beobachtung mit der ersten Beobachtung in Typ1.rates multiplizieren will (das [1,1] ist) und so weiter.

Dies ist offensichtlich einfach, wenn ich zwei Arten von Raten habe, aber wenn ich 25 Typen und große Matrizen/Datenrahmen habe, wird es schwierig, manuell zu tun.

Jeder mit einer guten Möglichkeit, dies zu tun?

Wenn mehr Erklärung oder Daten/Code benötigt wird, informieren Sie mir bitte

EDIT:

Mit den Samen gesetzt oben ich die folgenden Matrix

     V1   V2   V3   V4 
1: 141.8580480 1149.9857213 303.4234747 1014.77951629 
2: 770.1481988 407.0247813 1219.3383377 156.62140585 
3: 554.1117304 983.2339648 239.1584652 50.52442765 
4: 584.8300270 1207.7605414 2252.7680594 43.13052390 
+0

haben Sie überprüfen, ob Ihr Beispiel fehlerfrei ist? –

+0

Vielleicht ändern Sie die 16 bis 40 in dem Datenrahmen, den Sie zuweisen? So, um 10 Zeilen zu haben und es schaffen, die 'type'-Spalte anzuhängen. 'x <- as.data.frame (Matrix (rexp (40, rate = .2), ncol = 4) * 100)' –

+0

Es wird bevorzugt, wenn Sie zuerst eine 'set.seed' hinzufügen (also wir könnte Ihre Daten reproduzieren) und zeigen dann die genaue gewünschte Ausgabe. –

Antwort

6

Entweder verwenden zu bekommen hoffen eine einfache Multiplikation

set.seed(1223) 
g.rates[x[, 5], ] * x[, -5] # Note in your question you missed to include Typ2.rates 

Oder mit data.table

library(data.table) 
setDT(x)[, .SD*g.rates[x$Type,] , .SDcols = paste0("V", 1:4)] 
#  V1  V2  V3   V4 
#1 141.8580 1149.9857 303.4235 1014.77952 
#2 770.1482 407.0248 1219.3383 156.62141 
#3 554.1117 983.2340 239.1585 50.52443 
#4 584.8300 1207.7605 2252.7681 43.13052 
+0

@DavidArenburg ja !! Warum habe ich es kompliziert ?! Bitte schreiben Sie es als Antwort –

+0

ich erwähnt habe es als Kommentar @DavidArenburg Dank –

+1

Ich habe versucht, die Linie Ihre schrieb, sondern gibt den folgenden Fehler: 'Fehler in' [.data.frame' (x, g.rates [Typ ,] * .SD, by = "Type"): nicht verwendetes Argument (von = "Type") ' – pApaAPPApapapa

2

Zusammenfassung

Sie Bedingungen direkt in den Datenrahmen machen können wie so neue Werte zuweisen:

x[x$Type == 1, ] 

Dadurch werden alle x Werte anzeigen, die ==1

entsprechen Was Sie als nächstes brauchen, ist die Verwendung der von Ihnen hinzugefügten Raten, zum Beispiel:

x[x$Type == 1, ] * Typ1.rates 

Schlusscode

Sagen wir, Sie Schleife wollen durch alle Typen, die Sie und Einsatzbedingungen haben, etwa so:

Typ1.rates <- c(1.1,1.2,0.9,1.4) 
Typ2.rates <- c(1.4,5.2,1.9,0.4) 
g.rates <- t(cbind(Typ1.rates, Typ1.rates)) 


x <- as.data.frame(matrix(rexp(16, rate=.2), ncol=4)*100) 
x$Type <- c(1,1,1,2) 

for(i in 1:nrow(g.rates)) { 
    # We apply the change to the n-1 columns in order to prevent any change to the type column 
    x[x$Type == i, 1:(ncol(x)-1) ] <- x[x$Type == i, 1:(ncol(x) -1) ] * as.list(g.rates[i,]) 
} 

Dies sollte ziemlich schnell ausgeführt werden.

+0

Vielen Dank für die Antwort. Allerdings kann ich die „eval (parst (“ need Teil. Kann ich nicht rufen Sie die i-te Zeile in der g.rates data.frame/Matrix, solange die Preise nach Typ Zeilen sortiert sind? – pApaAPPApapapa

+0

I bearbeiten die Antwort, um mit dieser Lösung zu arbeiten, auch der Datenrahmen für eine Multiplikation für Zeile in eine Liste umgewandelt werden muss, ich habe mit dieser Methode konsistente Ergebnisse einsehen. –

2

Wir können dies in tun base R

do.call(rbind, Map(`*`, split(x[-5], x$Type), 
       split(g.rates, row(g.rates)))) 
#  V1  V2  V3  V4 
#1.1 141.8580 1341.650 303.4235 869.81101 
#1.2 840.1617 373.106 1896.7485 100.68519 
#1.3 453.3641 983.234 292.3048 50.52443 
#2 584.8300 1207.761 2252.7681 43.13052 
Verwandte Themen