2013-05-30 9 views
2

Je rencontre des problèmes lors de la création d'un sous-ensemble d'un objet de série chronologique dans r.Séries temporelles de sous-ensembles dans r

1.J'ai importé un fichier de format CSV en R comme suit (après avoir enlevé la colonne de date dans Excel)

sz.bm.df <- read.csv('size_book_25.csv',header=T) 

2.Le fichier CSV a 1038 lignes et 25 colonnes, les valeurs manquantes sont désignés par -99,99

3.I a ensuite créé un objet de série chronologique avec une plage de dates personnalisée comme suit

szbm.ts.data <- ts(data=sz.bm.df,start=c(1926,7),frequency=12) 

4. Maintenant, je voudrais faire face au problème des valeurs manquantes (j'ai des problèmes avec cela). Je voudrais créer un sous-ensemble de l'objet série temporelle qui commence à partir de la dernière ligne sur laquelle nous trouvons -99.99 jusqu'à la fin de l'objet d'origine. J'ai essayé ce qui suit pour en extraire les dates auxquelles les valeurs manquantes doivent être trouvées:

time(szbm.ts.data[which(szbm.ts.data==-99.99)]) 

cependant, au lieu de me donner une série de dates cela me donne:

[1] 1 2 3 4 5 6 7 8 9 10 11 12 

attr ("c ") [1] 1 12 1

Qu'est-ce que je fais mal ici?

merci pour toute aide

Répondre

4

Voici quelques alternatives:

1), utilisez la commande fenêtre (voir ?window)

tt <- ts(c(1:5, -99, 6:9), start = 2000, freq = 12) 

t.start <- time(tt)[tail(which(tt == -99), 1)+1] 
window(tt, t.start) 

2) Représentez votre série chronologique comme zoo ou xts objet utilisant les paquets respectifs:

library(zoo) 

z <- as.zoo(tt) 

ix <- tail(which(z == -99), 1) + 1 
zz <- z[ix:length(z)] 

Nous continuons simplement à utiliser zz ou le convertir en ts classe: as.ts(zz).

3) La commande na.contiguous (voir ?na.contiguous) trouvera le plus long tronçon de non-NA.

tt[tt == -99] <- NA 
na.contiguous(tt) 

qui peut ou ne peut pas vous donner ce que vous voulez selon l'endroit où l'AN sont. Dans le cas de l'exemple ici, il semble que ce ne soit pas ce que vous voulez, mais dans votre exemple réel, cela peut être correct s'il ne comprend que quelques NA au début.

Pour 2 données dimensionnelles nous pouvons utiliser ceci:

m <- matrix(1:24, 6) 
m[2,2] <- m[1,4] <- -99 
t2 <- ts(m, start = 2000, freq = 12) 

# 1 
has.na <- apply(t2 == -99, 1, any) 
t.start <- time(tt)[tail(which(has.na), 1)+1] 
window(t2, t.start) 

# 2 
library(zoo) 
z <- as.zoo(t2) 
has.na <- apply(z == -99, 1, any) 
ix <- tail(which(has.na), 1) + 1 
z[ix:nrow(z)] 

# 3 
t2[] <- apply(t2, 2, function(x) replace(x, x == -99, NA)) 
na.contiguous(t2) 

Note: À l'avenir, s'il vous plaît énoncer des questions sous forme reproductible comme indiqué ici: How to make a great R reproducible example?

MISE À JOUR: Ont aussi des exemples ajoutés de réaliser ces opérations sur des séries temporelles multivariées.

MISE À JOUR 2: l'orthographe corrigée de na.contiguous

+0

merci je vais essayer! – HalfAFoot

+0

J'ai essayé votre première solution mais j'ai obtenu ** NA ** en conséquence. J'ai essayé ce 'idx <- time (szbm.ts.data) [queue (qui (szbm.ts.data == - 99.99), 1) +1]'. quand j'ai seulement essayé le 'queue suivant (qui (szbm.ts.data == - 99,99), 1) + 1', je reçois un très grand nombre ** 24973 ** .... aide !! – HalfAFoot

+0

@Half, Ont ajouté des exemples de cela avec des séries multivariées. Veuillez suivre les instructions dans ** note ** avant de poser d'autres questions. –

Questions connexes