IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Optimisation boucle R


Sujet :

R

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Data scientist
    Inscrit en
    Février 2017
    Messages
    211
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Data scientist
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2017
    Messages : 211
    Par défaut Optimisation boucle R
    Bonjour,

    Je souhaite optimiser cette boucle ou avoir une fonction R qui pourra faciliter le calcul. La boucle tourne encore au bout de 15min.

    Merci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    #Coef_final2 est une data.frame
    for ( i in 1:32604){ 
      for ( j in 1:52)
      coef_final2[i, j+2] = coef_final1[i,j+1]*coef_final1[i,j+55]
    }

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     for ( j in 1:52) coef_final2[, j+2] = coef_final1[,j+1]*coef_final1[,j+55]
    Ca devrais pas mal accélérer déjà, même s'il y a surement plus opti.

  3. #3
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Par défaut
    Bonjour,

    Si j'ai bien compris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    coef_final2[, 3:54] <- coef_final1[, 2:53]*coef_final1[, 56:107]
    Cdlt

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Par défaut
    @tototode: ta fonction ne fait pas la même chose. Dans le code d'origine, la valeur en j+2 dépends de la valeur en j+1 donc il faut forcément utiliser une boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    > a=as.numeric(1:107)
    >  for ( j in 1:52 ) a[j+2] = a[j+1]*a[j+55]
    > head(a)
    [1]        1        2      112     6384   370272 21846048
    > b=as.numeric(1:107)
    > b[3:54] <- b[2:53]*b[56:107]
    > head(b)
    [1]   1   2 112 171 232 295

  5. #5
    Membre chevronné
    Inscrit en
    Février 2011
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 276
    Par défaut
    @Theta : ça aurait été vrai si l'objet de stockage était le même que l'objet sur lequel se fait l'opération mais ici ce n'est pas le cas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    coef_final1 <- as.data.frame(matrix(NA, 32604, 107))
    tab <- as.data.frame(matrix(rpois(32604*104, 5), 32604))
    coef_final1[c((1:52)+1, (1:52)+55)] <- tab
     
    coef_final2 <- as.data.frame(matrix(NA, 32604, 54))
    coef_final3 <- coef_final2 
     
    for ( j in 1:52) coef_final2[, j+2] = coef_final1[,j+1]*coef_final1[,j+55]
     
    coef_final3[, 3:54] <- coef_final1[, 2:53]*coef_final1[, 56:107]
     
    all.equal(coef_final2, coef_final3)
    [1] TRUE
    cdlt

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2012
    Messages : 325
    Par défaut
    Ha oui j'avais pas vu qu'il y avait deux objets.
    Ta version est donc la plus performante.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.0] Optimisation boucle while pour envoi d'e-mails
    Par renaud26 dans le forum Langage
    Réponses: 1
    Dernier message: 18/02/2010, 08h22
  2. Optimisation boucle for
    Par kwatz dans le forum MATLAB
    Réponses: 10
    Dernier message: 03/03/2009, 08h48
  3. Optimiser boucles de boucles (comparer de i en i)
    Par blaame dans le forum Macros et VBA Excel
    Réponses: 26
    Dernier message: 08/04/2008, 20h54
  4. optimisation boucle
    Par casefayere dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 23/10/2007, 16h43
  5. [Optimisation] Boucles for ou while et mysql_result ?
    Par sorenson dans le forum Langage
    Réponses: 5
    Dernier message: 22/12/2006, 09h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo