2017-04-18 1 views
0

J'ai un xts de 1 et 0 indiquant un événement sur une date. Je voudrais avoir R boucle chaque vendredi dans l'index et voir s'il y a des 1 pour cette semaine. J'ai ceci:'Indice en dehors des limites.' dans period.apply

> this = xts(sample(c(0,1), replace=TRUE, size=10), 
      order.by = seq.Date(as.Date('1990-01-05'), by = 1, length.out=10)) 
> this 
      [,1] 
1990-01-05 0 
1990-01-06 1 
1990-01-07 0 
1990-01-08 0 
1990-01-09 0 
1990-01-10 0 
1990-01-11 1 
1990-01-12 0 
1990-01-13 0 
1990-01-14 0 
> that = index(this)[.indexwday(this) == 5] 
> that 
[1] "1990-01-05" "1990-01-12" 
> period.apply(this, INDEX=that, FUN=function(x) max(x)) 
Error in `[.xts`(x, (INDEX[y] + 1):INDEX[y + 1]) : 
    subscript out of bounds 

Comme vous pouvez le voir, j'obtiens l'erreur. De l'aide?

EDIT:

Je compris l'erreur. 'INDEX' est censé être un numéro de vecteur ou de ligne, pas des dates. Cela fonctionne:

period.apply(this, INDEX=c(0, which(index(this) %in% that)), FUN=function(x) max(x)) 

Cependant, je suis bloqué sur le problème original. Je ne sais pas comment obtenir la première occurrence du 1 dans la série. J'ai essayé ceci:

> period.apply(this, INDEX=c(0, which(index(this) %in% that)), FUN=function(x) index(x)[min(which(x==1))]) 
      [,1] 
1990-01-05 7309 
1990-01-12 7310 

Mais je ne sais pas ce que c'est. Je devine que l'index ne passe pas par 'x' pour être passé à la fonction.

Des idées sur la façon de faire ce que je tente?

Répondre

0

Je voudrais avoir boucle R à travers chaque vendredi dans l'index et voir s'il y a des 1 est pour cette semaine

pas clairement ce que vous voulez, donc ce qui compte le nombre d'événements dans la semaine pour toi.

7309, 7310 correspondent aux valeurs numériques des dates que vous êtes de retour avec l'index (x) [....]

period.apply(this, INDEX=c(0, which(index(this) %in% that)), FUN=function(x) { sum(x==1)}) 
0

Si vous voulez que le premier jour de chaque semaine où votre objet XTS a une valeur de 1, vous pouvez:

  1. split votre XTS objet dans une liste de données pour chaque semaine,
  2. lapply fonction pour trouver la première observation égale à 1,
  3. rbind la liste dans un seul objet xts.

Et voici un exemple:

set.seed(21) 
this <- xts(sample(0:1, 10, TRUE), seq(as.Date("1990-01-05"), by=1, length.out=10)) 
first1 <- function(x) first(x[x==1]) 
weeklist <- split(this, "weeks") 
week1 <- do.call(rbind, lapply(weeklist, first1)) 

Et voici les données d'échantillon et résultat:

R> this 
      [,1] 
1990-01-05 1 
1990-01-06 0 
1990-01-07 1 
1990-01-08 0 
1990-01-09 1 
1990-01-10 1 
1990-01-11 0 
1990-01-12 0 
1990-01-13 1 
1990-01-14 1 
R> week1 
      [,1] 
1990-01-05 1 
1990-01-09 1