2016-09-15 3 views
1

Ich versuche eine neue Variable in einem Datensatz (+/- 10K Zeilen) zu erstellen, indem ich über einen anderen Datenrahmen basierend auf zwei Variablen im Datensatz iteriere . Irgendwie kann ich es nicht herausfinden, ohne Merge zu benutzen (nur um R zu lernen), vielleicht kann mich jemand in die richtige Richtung führen.Erstellen einer neuen Variablen durch Iteration über Spalten und Zeilen eines anderen Datenrahmens in R

Snapshot aus dem Datensatz - dat

ContractNumber | PDRating | PD_month 
--- 
1 | 7+ | 1  
--- 
1 | 7+ | 2 
--- 
1 | 7+ | 3 
--- 
2 | 6+ | 1 
--- 
2 | 6+ | 2 
--- 
and so on..... 

So hat jeder Vertrag eine PDRating (die für Probability of Default Rating steht) und eine PDMonth, die den Monat stellt der Vertrag ist also, wenn ein Vertrag eine hat. Länge von 60 Monaten gibt es 60 Datensätze für den Vertrag. (übrigens meine erste Frage zu StackOverflow und ich habe noch nicht herausgefunden, wie ich eine gut aussehende Tabelle formatieren kann)

Der Datenrahmen (PD_Table) Ich möchte über iterieren besteht aus 180 Zeilen, die Monate und in darstellen de Header die PDRatings als Spaltennamen. Welche sieht wie folgt aus:

PD_month | 5- | 6+ | 6 | 6- | 7+ | ... 
--- 
1 | 0.0001 | 0.0002 | 0.0004 | 0.0005 | ... 
--- 
2 | 0.0001 | 0.0002 | 0.0004 | 0.0005 | ... 
--- 
3 | 0.0001 | 0.0002 | 0.0004 | 0.0005 | ... 
--- 
4 | 0.0001 | 0.0002 | 0.0004 | 0.0005 | ... 
--- 
5 | 0.0001 | 0.0002 | 0.0004 | 0.0005 | ... 
--- 
and so on..... 

Die neue Variable ich so zu schaffen versuche ist dat $ PD und das neue „dat“ aussehen sollte:

ContractNumber | PDRating | PD_month | PD 
--- 
1 | 7+ | 1 | 0.0005 
--- 
1 | 7+ | 2 | 0.0005 
--- 
1 | 7+ | 3 | 0.0005 
--- 
2 | 6+ | 1 | 0.0002 
--- 
2 | 6+ | 2 | 0.0002 
--- 
and so on..... 

Ich habe es jetzt geschieht durch:

Nun, das funktioniert, fühlt sich aber ein wenig ungeschickt an und ich muss die Zeilen sortieren und die Spalten neu anordnen. Also im Grunde ich für eine intelligentere Lösung suchen

Unter den Dingen, die ich versuchte, die nicht funktionierten, waren die folgenden:

dat$PD <- PD_Table[dat$PD_month, dat$PDRating] 
# Returns a vector with all values for a rating as PD value] 
# Note PD_Table was still in wide format 

dat$PD <- for (i in nrow(dat)) PD_Table[dat$PD_month[i], dat$PDRating[i]] 
# Does not returns anything 

dat$PD <- for (i in nrow(dat3)) PD_Table[dat$PD_month[i], which(dat3$PDRating[i] == colnames(PD_Table))] 
# Does not returns anything 

Jede Hilfe sehr geschätzt!

Mit freundlichen Grüßen, Matthies

+0

könnten Sie eine Probe Ihrer Daten zur Verfügung stellen, indem Sie 'dput()' – loki

+0

Schmelzen und Verschmelzen ist definitiv „intelligente“ als for-Schleife in einem Iterieren! –

+0

Diese Frage sieht ziemlich ähnlich aus [http://stackoverflow.com/questions/39235882/how-can-i-reference-a-list-based-on-a-variable-within-a-data- Rahmen/39236060). Ich würde empfehlen, Matrixindizierung wie in meiner Antwort dort zu verwenden. – lmo

Antwort

0

macht diese Arbeit für Sie?

Ich habe Daten ähnlich den zwei Tabellen geladen, die Sie von csv gezeigt haben.

library(data.table) 
PDR <- as.data.table(read.csv("PDRatings.csv")); 
PDT <- as.data.table(read.csv("PDTable.csv")); 

schmelzen PD_table (hier PDT) zu lange Form.

PDTm <- melt.data.table(PDT, id.vars=c("PD_month"), 
         variable.name = "PDRating", 
         value.name = "PD") 

Etwas grässliche Säuberung der Nomenklatur.

PDTm[, PDRating := sub("X", "", PDRating)]  # X6 becomes 6 
PDTm[, PDRating := sub("5.", "5+", PDRating)] # 5. becomes 5+ 
PDTm[, PDRating := sub("6.$", "6-", PDRating)] # 6. becomes 6- 
PDTm[, PDRating := sub("7.$", "7-", PDRating)] # 7. becomes 7- 
PDTm[, PDRating := sub("6..1", "6+", PDRating)] # 6..1 becomes 6+ 
PDTm 

Zuletzt Tabellen zusammenführen.

setkey(PDR, PDRating, PD_month) 
setkey(PDTm, PDRating, PD_month) 

merge(PDR, PDTm, all.x=TRUE) 

Was denken Sie? Ich habe Ausgabe wie mit den Daten erwartet, die lautet:

PDRating PD_month ContractNumber PD 
1:  6+  1    2 5e-04 
2:  6+  2    2 5e-04 
3:  7+  1    1 NA 
4:  7+  2    1 NA 
5:  7+  3    1 NA 
+0

Hallo Sun Bee, vielen Dank für die Mühe aber das scheint mir noch ein bisschen zu viel Code für eine relativ (zumindest konzeptionell :)) einfache Aufgabe zu sein. Ich war auf der Suche nach einer vektorisierten Lösung, aber im Moment bleibe ich bei der Zusammenführung von Datensätzen. Prost, Matthies –

Verwandte Themen