2 votes

Augmenter la résolution des données d'un vecteur de durées d'épisodes sans fonction de boucle

J'ai un vecteur Z<-c(0, 0, 0, 0, 360, 0, 0, 0, 0) d'une durée quotidienne d'événements (chaque élément du vecteur est un jour et la valeur de chaque élément est la durée de l'épisode en minutes) de sorte que chaque élément du vecteur est [0,1440].

Je voudrais convertir le vecteur des minutes quotidiennes en intervalles d'une minute (de sorte que chaque élément du vecteur soit un intervalle d'une minute) et que la valeur de chaque élément soit [0,1]. J'ai trouvé la solution suivante

Z<-c(0, 0, 0, 0, 360, 0, 0, 0, 0)
c.Z<-1440- Z

temp<-NULL
for (i in 1:length(Z)){
temp<-c(temp, c(rep(1,Z[i]), rep(0,c.Z[i])))    
}

temp

> sum(temp)==sum (Z)
[1] TRUE
> length(temp)==1440*length(Z)
[1] TRUE

Existe-t-il un moyen plus rapide, plus agréable ou plus rapide d'effectuer cette opération sans l'aide de l'interface utilisateur ? for fonction ?

1voto

Ronak Shah Points 24715

Vous pouvez utiliser rep de cette manière :

temp2 <- rep(rep(c(1, 0), length(Z)), c(rbind(Z, 1440-Z)))
identical(temp, temp2)
#[1] TRUE

Le premier rep répète 1, 0 pour chaque jour.

rep(c(1, 0), length(Z))
#[1] 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0

Nous utilisons c(Z, 1440-Z) pour créer des temps d'argument pour le deuxième rep .

c(rbind(Z, 1440-Z))
#[1]  0 1440 0 1440  0 1440  0 1440 360 1080  0 1440  0 1440 0 1440  0 1440

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X