2010-08-16 9 views
1

J'ai un premier vecteur, disons x qui ne comprend que 1 et -1. Ensuite, j'ai un second vecteur y composé de 1, -1 et zéros. Maintenant, je voudrais créer un vecteur z qui contient entre autres dans l'index 1 si x[i] est égal à 1 et 1 existe dans le vecteur y entre les éléments précédents n (y[(i-n):i]) ...Création d'un vecteur spécifique sans boucle ni récursivité dans R

plus formellement: z <- ifelse(x == 1 && 1 %in% y[(index(y)-n):index(y)],1,0)

Je cherche à créer un tel vecteur dans R sans bouclage ni récursion. La proposition ci-dessus ne fonctionne pas car elle ne reconnaît pas prendre l'expression y[(index(y)-n):index(y)] élément par élément.

Merci beaucoup pour votre soutien

Répondre

1

Vous pouvez utiliser apply comme ça, même si elle est essentiellement une jolie façon de faire une boucle, je ne sais pas si ce sera plus rapide (il peut ou ne peut pas) .

y1 <- unlist(lapply(1:length(x), function(i){1 %in% y[max(0, (i-n)):i]})) 
z <- as.numeric(x==1) * as.numeric(y1) 
+0

Salut Nico, Merci beaucoup pour votre rapide et très utile commentaire, je vais vérifier la vitesse, mais je suis plutôt convaincu que votre solution est plus rapide qu'une boucle ordinaire R. Cordially , martin – martin

2

est ici une approche qui utilise la fonction cumsum pour tester le nombre de ceux qui ont été vus jusqu'à présent. Si le nombre de ceux à la position i est supérieur au nombre de ceux à la position i-n, alors la condition sur la droite sera satisfaite.

## Generate some random y's. 
> y <- sample(-1:1, 25, replace=T) 
> y 
[1] 0 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 0 0 -1 -1 -1 1 -1 1 1 0 0 0 1 
> n <- 3 
## Compute number of ones seen at each position. 
> cs <- cumsum(ifelse(y == 1, 1, 0)) 
> lagged.cs <- c(rep(0, n), cs[1:(length(cs)-n)]) 
> (cs - lagged.cs) > 0 
[1] FALSE TRUE TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE 
[13] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE FALSE 
[25] TRUE 
+0

Nice one! J'ai pensé à utiliser 'cumsum' aussi mais je n'ai pas compris comment implémenter le lag. – nico

+0

wow, merci beaucoup à votre aide – martin

Questions connexes