2016-04-18 5 views
1

Ich bin immer noch ziemlich neu zu R und Programmierung im Allgemeinen und ich brauche etwas Hilfe. Entschuldige, dass ich den Feed mit einer ziemlich einfachen Frage blockiert habe. Aber ich versuche wirklich gut mit R zu werden und hätte gerne Feedback.Neu zu R: Hilfe, sich an Vektoren und "Vektorisieren" für Schleifen zu gewöhnen

Hintergrund

Ich habe eine Menge Mathematik in der Universität und bin sehr vertraut mit dem Nachweis durch Induktion/Serie Notation/Indizierung Sets, während gerade dieses Semesters studiert, ich meine erste lineare Algebra-Klasse nähme. Während ich also mit Vektoren vertraut bin, sind meine logischen Prozesse sehr stark auf die Indexierung von Variablen zum Navigieren in Sets ausgerichtet (Entschuldigung, wenn mein Wort nicht das beste ist).

Da ich mit R vertrauter werde, gibt es viele Dinge, die ich mit "for" -Schleifen programmieren möchte, aber ich wüsste, dass sie mit einer vektorisierten Funktion effizienter arbeiten würden. Das einzige Problem ist, dass ich nicht sicher bin, wie ich die Logik mit Vektoren ausdrücken soll. Ich habe nach ähnlichen Fragen gesucht, aber nichts hilft mir bei meinem speziellen Problem. Eine Menge von dem, was ich finde, ist jetzt über meinem Kopf und hilft nicht. Ich werde das neueste Beispiel verwenden.

Beispiel beginnt hier

ich auf einem Datensatz mit rund 1,6 Millionen Beobachtungen arbeitete. Ich möchte die Inflationspreise anpassen, daher muss ich den Beobachtungsmonat mit dem Monat des entsprechenden VPI-Index vergleichen. Ich habe meinen Hauptdatenrahmen (den mit 1,6 Millionen Beobachtungen) und einen Datenrahmen mit dem CPI-Index, den ich brauche (dies hat nur 12 Beobachtungen, einen für jeden Monat in dem Jahr, in dem meine Analyse stattfindet).

So wollte ich zunächst jede Beobachtung mit ihrem entsprechenden CPI-Index "übereinstimmen".

`for(i in 1:nrow(large.data.frame)){ 
    for(j in 1:nrow(CPI)){ 
    if(months(large.data.frame[i,"Date"])==months(CPI[j,"Date"])){ 
     CPImatch[i] <- CPI[j,2] 
    } 
    else next 
    } 
}` 

HINWEIS: CPImatch ist ein separater Datenrahmen I in die angepassten Werte verwenden, würde zu platzieren und sie dann mit meinem ursprünglichen Datenrahmen cbind. Außerdem weiß ich, dass es wahrscheinlich einen besseren Weg gibt, dies zu tun ...

Ich weiß, das ist eine unglaublich ineffiziente Art zu tun, was ich will. In der Tat bin ich nicht einmal sicher, ob das funktioniert, weil der Code noch läuft. Ich bin mir jedoch nicht sicher, wie ich es vektorisieren und effizienter machen kann. Ich bin mir sicher, dass es eine Funktion in der Anwendungsfamilie gibt, die ich brauche, aber ich bin immer noch ein wenig unsicher, wie diese funktioniert. Teil meines Problems ist, dass ich vergesse, welche Funktionen vektorisiert sind und welche nicht, ich wurde einfach nicht allen benötigten Funktionen in R ausgesetzt, da ich noch relativ neu bin.

Jede Rückmeldung wird sehr geschätzt!

Danke.

+0

Es wäre gut, wenn Sie Ihre Frage mit einem kleinen Beispiel sowohl Ihres large.data.frame und der CPI-Daten als auch des erwarteten Ergebnisses bearbeiten könnten. Das sieht so aus, als ob eine Schleife nicht benötigt wird, vielleicht nur passend. [Info über ein reproduzierbares Beispiel] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) – user20650

+0

Eines der größten Dinge, die Sie tun können, um Ihre Geschwindigkeit zu verbessern würde über den Schleifen vorprogrammieren CPImatch: 'CPImatch <- numerisch (nrow (large.data.Rahmen)) ' – lmo

+1

Dieser Artikel auf Funktionals half mir, zu beginnen: http://adv-r.had.co.nz/Funktionals.html. – AllanT

Antwort

1

Sie Code kann sicherlich viel schneller gemacht werden. Ein einfacher Schritt wäre, die Monate vorzuberechnen, anstatt sie viele Male zu berechnen. Die Vektorisierung wird es noch schneller machen. Ich denke, dass der folgende Code funktionieren sollte, die Monate auf CPI abbildet - schwierig ohne Testdaten zu testen.

require(plyr) 
CPImatch <- mapvalues(months(large.data.frame$Date), from = months(CPI$Date), to = CPI[,2])