j'ai 4 types d'instructions, dites I1, I2, I3, I4, et je dois utiliser ces instructions dans un programme, selon les probabilités suivantes:
- avec 1 % de chance, j'utilise I1
- avec 85% de chance, j'utilise I2
- avec 7% de chance, j'utilise I3
- avec 7% de chance, j'utilise I4
(note: 1% + 85% + 7% + 7% = 100%)Comment vectoriser une boucle de conditions
Chaque instruction crée un point à 2 coordonnées (x, y) que j'empile dans une trame de données df.
Je sais que je peux le faire en utilisant le code suivant:
df <- c(0,0)
for (i in 1:n)
{
x <- sample(1:100, 1)
if (x==1) { I1 }
if (x>=2 & x<=86) { I2 }
if (x>=87 & x<=93) { I3 }
if (x>=94 & x<=100) { I4 }
df <- rbind(df, c(x, y))
}
Mais cela est horriblement temps dans la mesure où « n » est pas petite. Je voudrais vectoriser le code, afin d'accélérer le traitement, mais je ne trouve pas comment.
Une idée?
POUR UNE COMPRÉHENSION COMPLÈTE: le programme vise à reproduire la fougère Barnsley.
A1 <- matrix(c(0,0,0,0.16), byrow=FALSE, ncol=2)
V1 <- matrix(c(0,0), byrow=FALSE, ncol=1)
A2 <- matrix(c(0.85,-0.04,0.04,0.85), byrow=FALSE, ncol=2)
V2 <- matrix(c(0,1.6), byrow=FALSE, ncol=1)
A3 <- matrix(c(0.2,0.23,-0.26,0.22), byrow=FALSE, ncol=2)
V3 <- matrix(c(0,1.6), byrow=FALSE, ncol=1)
A4 <- matrix(c(-0.15,0.26,0.28,0.24), byrow=FALSE, ncol=2)
V4 <- matrix(c(0,0.44), byrow=FALSE, ncol=1)
z1 <- matrix(c(0,0), byrow=FALSE, ncol=1)
df <- as.data.frame(t(z1))
for (i in 1:1000)
{
x <- sample(1:100, 1)
if (x==1) { z2 <- A1%*%z1 + V1}
if (x>=2 & x<=86) { z2 <- A2%*%z1 + V2}
if (x>=87 & x<=93) { z2 <- A3%*%z1 + V3}
if (x>=94 & x<=100) { z2 <- A4%*%z1 + V4}
df <- rbind(df, t(z2))
z1 <- z2
}
plot(df$V1, df$V2, xlab="", ylab="")
Regardez findInterval. Il y a beaucoup d'exemples travaillés sur SO. –
La partie lente de votre code est probablement la partie 'rbind()', pas les instructions 'if'. Sans savoir exactement ce que sont ces «instructions», il est difficile de dire s'il y a une meilleure façon de vectoriser. Il est plus facile d'aider si vous fournissez une sorte de [exemple reproductible] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) avec des exemples de données d'entrée afin que nous puissions effectivement exécuter le code nous-mêmes. – MrFlick