2010-11-18 40 views
3

Je cherche à créer une copie d'une colonne existante dans une image donnée qui est compensée par un nombre de lignes.R Créer une copie d'une colonne où la nouvelle colonne est compensée par un certain montant fixe

E.g. si colonne2 est une copie de colonne1 compensée par 1, puis

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

$column2 
[1] 0 1 2 3 4 

J'ai eu un certain succès avec le code suivant:

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

Cependant, il commence à donner des erreurs si j'OFFSET par 30 ou plus. Mes données sont assez longues pour que cela ne soit pas un problème d'offset plus grand que le nombre de lignes. L'erreur est:

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

Merci d'avance! Une version sans boucle rapide qui joue bien avec plyr serait préférable. L'intention ici est de diviser les données de timeseries en différents délais pouvant aller jusqu'à un an, puis d'analyser les résultats de diverses manières.

+0

sur un sidenote: plyr n'est pas exactement "sans boucle". C'est une structure en boucle. –

+0

Joris: J'utilise plyr pour diviser la dataframe en bits sur lesquels je travaille ensuite individuellement de manière à ce que ce soit quelque chose qui s'intègre parfaitement dans ce workflow. Par exemple. dans ce cas, je divisais les données du marché par symbole boursier, puis j'ajoutais une nouvelle colonne qui compensait la colonne précédente de 30 jours. Mon code était: marketdata <- ddply (marketdata, c ("stock_symbol"), transformer, adj.close.Prev30 = c (liste30, adj.close [1: (longueur (stock_symbol) -30)]), parallel = TRUE) mais merci pour les heads up! :) – psandersen

Répondre

8

Veuillez utiliser pour utiliser une classe de séries chronologiques appropriée pour les opérations en série temporelle. Les favoris populaires sont zoo et xts tous les deux ont beaucoup de de la documentation.

Comme un exemple simple, tenez compte

> 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 
> 

Mais ne pas le faire manuellement. Et cherchez ici '[r] xts' ou [r] zoo 'pour chercher dans la balise R.

+1

+1 Je n'aurais pas pu dire mieux moi-même ... – Shane

+0

Merci beaucoup! C'est exactement ce que je cherchais. – psandersen