2010-11-18 5 views
3

Ich möchte eine Kopie einer vorhandenen Spalte in einem Datenrahmen erstellen, der um eine Anzahl von Zeilen versetzt ist.R Erstellen Sie eine Kopie einer Spalte, in der die neue Spalte um einen festen Betrag versetzt ist.

z. wenn column2 eine Kopie von column1 um 1 versetzt ist, dann

> dataframe 
$column1 
[1] 1 2 3 4 5 

$column2 
[1] 0 1 2 3 4 

Ich habe einige Erfolge mit dem folgenden Code hat:

offset7 <- rep(0, 7) 
dataframe$column1.prev7 = c(offset7, dataframe$column1[1:(length(dataframe$column1)-7)]) 

aber es beginnt eine Fehlermeldung, wenn ich mit 30 oder mehr gegenüber. Meine Daten sind lang genug, dass dies kein Problem darstellt, da der Offset größer ist als die Anzahl der Zeilen. Der Fehler lautet:

Error in dataframe$column1[1:(length(dataframe$column1) - 30)] : 
    only 0's may be mixed with negative subscripts 

Vielen Dank im Voraus! Eine schnelle Schleife freie Version, die schön mit Plyr spielt, wäre bevorzugt. Ziel ist es, die Zeitreihendaten bis zu einem Jahr in verschiedene Lags zu zerlegen und die Ergebnisse dann auf verschiedene Arten zu analysieren.

+0

auf einer Nebennote: plyr ist nicht genau "loop free". Es ist eine Schleifenstruktur. –

+0

Joris: Ich benutze plyr, um den Datenrahmen in Bits zu teilen, an denen ich dann einzeln arbeite, also bevorzuge etwas, das gut in diesen Workflow passt. Z.B. In diesem Fall habe ich die Marktdaten um das Aktiensymbol aufgespalten und dann eine neue Spalte hinzugefügt, die die vorherige Spalte um 30 Tage versetzt. Mein Code war: marketdata <- ddply (Marktdaten, c ("stock_symbol"), transformieren, adj.close.Prev30 = c (liste30, adj.close [1: (Länge (stock_symbol) -30)])), parallel = WAHR) aber danke für die heads-up! :) – psandersen

Antwort

8

Bitte eine geeignete Zeitreihenklasse für Zeitreihenoperationen verwenden. Beliebte Favoriten sind zoo und xts, die beide viel der Dokumentation haben.

Als einfaches Beispiel betrachten

> library(xts) 
> foo <- xts(100:109, order.by=Sys.Date()+0:9) 
> merge(foo, l1=lag(foo,1), lm1=lag(foo,-1)) 
      foo l1 lm1 
2010-11-18 100 NA 101 
2010-11-19 101 100 102 
2010-11-20 102 101 103 
2010-11-21 103 102 104 
2010-11-22 104 103 105 
2010-11-23 105 104 106 
2010-11-24 106 105 107 
2010-11-25 107 106 108 
2010-11-26 108 107 109 
2010-11-27 109 108 NA 
> 

Aber gerade Sie es nicht von Hand tun. Und suchen Sie hier nach '[r] xts' oder '[r] zoo', um innerhalb des R-Tags zu suchen.

+1

+1 Ich hätte es besser nicht selbst sagen können ... – Shane

+0

Vielen Dank! Genau das habe ich gesucht. – psandersen