1. Grâce à ce formulaire vous pouvez proposer une astuce ou un script sur R.
  2. Votre script doit pouvoir être lancé en l'état. Veuillez penser à :
    • inclure le chargement des "library" nécessaires
    • construire un petit jeu de données si besoin est.
    • commenter les lignes de codes pour en faciliter la compréhension.
  3. Le titre de votre script ou astuce doit être clair et explicite.
  4. Pensez à mettre votre code entre les balises [R] et [/R]; Pour cela, vous pouvez utiliser le bouton

Vous pouvez utiliser vos comptes Facebook, twitter ou google pour vous identifer (google est compatible yahoo, openID...)
L'ideal étant de vous connecter si vous avez un compte utilisateur, ou faire une demande de compte utilisateur si vous n'en avez pas encore.
Créer un compte va vous permettre de pouvoir éditer vos codes et de mettre en avant votre site internet.
Sinon vous pouvez soumettre anonymement en remplissant les champs ci-après.







Choisissez les catégories correspondantes à votre Code:

  • algorithmique
  • Analyse de survie
  • base indispensable
  • bayésien
  • configuration de R
  • exportation de données
  • fonctions utiles
  • graphique
  • importation de données
  • inférence
  • manipulation de données
  • message d'erreur
  • modélisation
  • Non classé
  • optimisation
  • planification
  • programmer avec R
  • regression linéaire
  • Test
  • Transformation de données


Comment faire une boucle for avec R ?

11
dans algorithmique, base indispensable
for ( i in 1:10) { 
 
print(i) 
 
}

Cette commande peut se traduire par :
Pour (i allant de 1 à 10) 
 
{ affiche i}

Il faut noter que les parenthèses () servent à définir la variable et les valeurs qu’elle va prendre successivement à chaque tour de boucle. Les accolades {} servent à délimiter les actions à effectuer pour chacune des valeurs prises par la variable.

IMPORTANT : R n’aime pas vraiment les boucles for, il est beaucoup plus efficace d’utiliser apply. Tout particulièrement pour les très grandes et longues boucles, apply fait cela en une fraction de seconde… alors que for peut mettre plusieurs minutes, ou ne pas réussir.

Proposé par Vincent.

Ce script vous à rendu service? remerciez l'auteur en votant ici:
- ça ne sert à rien -- c\'est interessant - (score de +41 sur 41 votes)
Loading ... Loading ...

11 Comments

  1. Stan
    Posté le 3 mars 2012 a 23 h 54 min | Permalink

    Avec une boucle, on peut par exemple calculer des sommes cumulées des éléments d’une suite.

    Prenons la fonction : y = x^2.
    On veut la somme cumulée pour x = 0 à 100.

     
    #On initialise d'abord la boucle
    somme=0
     
    #Puis la boucle en soi...
    for(i in 0:100) {somme=somme+i^2
    print(somme)}
     
  2. Posté le 7 mars 2012 a 14 h 21 min | Permalink

    la plupart du temps il existe des fonctions qui font ça de manière vectorielle, par exemple cumsum
    il faut utiliser le moins possible les boucles dans R puisque ça ralentit souvent les calculs, il faut privilégier les apply ou alors utiliser un langage de bas niveau type C/C ++ et l’appeler dans R

  3. Stan
    Posté le 12 mai 2012 a 14 h 56 min | Permalink

    Et pour créer un vecteur des sorties d’une boucle for, il suffit de faire :

     
     somme=0
     
    #Il suffit alors de créer un "vecteur" de taille indéterminée
    res=NULL
     
    for(i in 0:100) {
      somme=somme+i^2
      res[i]=somme
    }
     
    res
     
  4. Roman
    Posté le 28 janvier 2013 a 11 h 35 min | Permalink

    Comment inclure un pas de temps dans une boucle for sur R?

    Merci

  5. Vincent
    Posté le 28 janvier 2013 a 11 h 48 min | Permalink

    @Roman :

     
     
    Sys.sleep()
     

    devrait répondre a votre question.

  6. Stan
    Posté le 26 juillet 2013 a 21 h 48 min | Permalink

    Encore un autre exemple d’application d’une petite boucle for : dans les boxplot, il peut être intéressant de séparer les box en groupes grâce à l’argument « at ».
    Par défaut le boxplot dessine les box à équidistance ; s’il y a 15 box, le « at » par défaut sera définie par la séquence 1,2,3…15. Si on veut par exemple séparer ces box en 5 groupes de 3, il faut créer (par exemple) la séquence 1.5,2,2.5,4.5,5,5.5…13.5,14,14.5.

    La boucle for permet de créer une telle séquence, à injecter ensuite dans le « at » du boxplot :

     
     x=NULL
    for(i in 1:5){
        x[c(3*i-2,3*i-1,3*i)]=c(3*i-1.5,3*i-1,3*i-0.5)
    }
    x
     

    Après il y a peut-être moyen de réaliser une telle séquence de manière plus simple, en passant par exemple par la fonction « seq » ou une autre fonction, sans avoir à passer par une boucle. Dans ce cas, je suis preneur…

  7. Vincent
    Posté le 26 juillet 2013 a 21 h 59 min | Permalink

    … je n’ai pas trouvé de trucplus élégant, ca n’a pas vraiment d’interet ici:

     
     x<-c()
    for ( i in 0:4){
    x<-c(x,seq(1.5+3*i,(1.5+3*i)+1,0.5))
    } 
     
  8. Stan
    Posté le 20 octobre 2013 a 23 h 14 min | Permalink

    Pas con ! Faire varier les les bornes de départ et d’arrivée d’une séquence plutôt que les positions des éléments dans un vecteur… Merci Vincent !

  9. Le_Pnume
    Posté le 6 octobre 2014 a 15 h 00 min | Permalink

    Il est possible de s’affranchir de la boucle avec lapply :

    unlist(lapply(0:4,function(x) seq(1.5+3*x,(1.5+3*x)+1,0.5)))

    par contre sur une boucle avec si peut d’itérations le gain de temps est anecdotique.avec 1000 itérations on gagne moins d’une seconde

    library(rbenchmark) fun_for<-function(iter){x<-c()for ( i in 0:iter){x<-c(x,seq(1.5+3*i,(1.5+3*i)+1,0.5))} }fun_lapply<-function(iter){unlist(lapply(0:iter,function(x) seq(1.5+3*x,(1.5+3*x)+1,0.5)))}   benchmark(fun_for(1000))           test replications elapsed relative user.self sys.self user.child sys.child1 fun_for(1000)          100    3.78        1      3.72        0         NA        NA benchmark(fun_lapply(1000))              test replications elapsed relative user.self sys.self user.child sys.child1 fun_lapply(1000)          100    3.11        1      3.11        0         NA        NA
  10. paul
    Posté le 15 janvier 2016 a 20 h 27 min | Permalink

    bonjour, je me suis creusé la tete ma je n’arrive pas à trouver de boucle R adaptée… alors j’en fait appel à vous si ce n’est pas trop compliqué :J’ai un tableau de données de mesures individuelles sur animal qui a la tete suivante :variable 1: jour (1,2,3,..,50)variable 2: id.animal (1,2,3,.., 100)variable 3: cage (a1,a2,a3,a4,a5,b1,b2,…, d3,d4,d5)variable 4: statut (1, 0)  –> 1= « en vie » et 0= »mort »variable 5: traitement (a, b, c, d)chaque variable correspond à une colonne d’un fichier excel converti en .txt Je voudrais connaitre le nombre cumulé d’animaux par condition et par jour.(pour ainsi faire une evolution de la survie cumulée au cours du temps pour chaque condition).Avez-vous une idée de boucle pour faire cela ?Merci par avance pour votre aide ;)  

  11. Arthur
    Posté le 19 mai 2016 a 14 h 24 min | Permalink

    bonjour, j’aimerai que vous decomposiez cette adresse pour moi sous R 16 rue du vieux fourneau, au fait j’ai plusieurs adresse et je dois faire la decomposition de ces adresses pour avoir le numero de rue , le type (rue, allee, bouleverd etc ) le nom de la voix.je sais pas si vous voyez ma préoccupation merci

Poster un commentaire


Votre email ne seras jamais communiqué champs requis désigné par une *

*
*


× 1 = quatre

Formation logiciel R