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 :

Boucle R dans Matrice


Sujet :

R

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ergonome
    Inscrit en
    Septembre 2014
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ergonome
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 21
    Points : 16
    Points
    16
    Par défaut Boucle R dans Matrice
    Bonjour à tous,

    Voici mon problème, je suis face à une matrice de 15000 lignes et de 4 colonnes. J'aimerais effectuer une boucle de calcul afin d'utiliser une formule sur les 30 premières lignes, puis sur les 30 suivantes et ainsi de suite.
    SI on part du principe que ma Matrice est A cela donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    mat=A
    det=NULL
     
    for (i in ? : ?)
    {B=as.vector(mat[? : ?])
      C=determinism(B)
       det=c(det,C)}
    Mon gros problème ici vous l'aurez compris est la méthode d'indiçage permettant de sélectionner 30 lignes par 30 lignes.

    Merci d'avance pour vos réponses.

  2. #2
    Membre éclairé
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Points : 793
    Points
    793
    Par défaut
    1) det est une fonction de base de R. Il n'est donc pas conseillé de surcharger ce symbole pour l'utiliser pour désigner une variable.
    2) l'écriture mat[?] n'est pas valide pour une matrice. Il y manque les colonnes.

    Maintenant, question basique pour tous les langages, comment sélectionner des lignes du matrice ? La réponse est évidente en donnant les indices des lignes d'intérêt. Donc la réponse à la question est évidente :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    l.dep <- 1
    nb.lignes <- 30
    while( l.dep < nrow( A)) {
       r.mat <- seq( l.dep, ifelse( l.dep + nb.lignes < nrow( A), l.dep + nb.lignes - 1, nrow( A)))
       B <- A[r.mat,]
       l.dep <- l.dep + nb.lignes
    }

  3. #3
    Membre actif
    Homme Profil pro
    Bioinformaticien
    Inscrit en
    Octobre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 126
    Points : 296
    Points
    296
    Par défaut
    Citation Envoyé par faubry Voir le message
    1) det est une fonction de base de R. Il n'est donc pas conseillé de surcharger ce symbole pour l'utiliser pour désigner une variable [...]
    Si galostroy le permet, une petite digression adressée à faubry. Alors, comme on en est sur les conventions de style, une excellente chose à encourager notamment dans le cas présent où l'espace des noms de base est pollué, que dire du style que vous adoptez pour les identificateurs composés de plusieurs mots ? Avec un style tel celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    l.dep <- 1
    nb.lignes <- 30
    quelqu'un qui connaît le S3 pourrait penser que vous voulez explicitement initier le dispatch (méthodes l et nb respectivement des classes dep et lignes). Plus encore, l'interpréteur serait lui-même amené à envisager cette possibilité.

    Il est vrai qu'une large portion de code existant utilise ce style (read.delim, read.csv, etc.), ça peut se comprendre pour du code venant des toutes premières versions de S : sans soute qu'au moment où ces versions étaient développées, il n'était pas courant de digresser sur les conventions de style. Mais aujourd'hui, ne serait-il pas judicieux de décourager cette « pollution de l'interpéteur » et de plutôt faire des choses ressemblant au code infra ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # Si on tient à introduire un caractère entre deux mots consécutifs
    l_dep <- 1
    nb_lignes <- 30
     
    # Sinon, le bon vieux camelCase ferait l'affaire
    lDep <- 1
    nbLignes <- 30

  4. #4
    Membre éclairé
    Homme Profil pro
    Chercheur
    Inscrit en
    Décembre 2015
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 327
    Points : 793
    Points
    793
    Par défaut
    Mon cher juliatheric

    Personnellement, je ne connais aucun langage pour lequel il est conseillé de surcharger des noms de fonction de base pour les utiliser comme variables, cela est juste une question de bon sens même si certains langages l'acceptent tandis d'autres génèrent une erreur. Une utilisation inconsidérée de noms de fonction comme nom de variable risque de conduire à des effets de bord, des erreurs ou des plantages (cf. MATLAB pour lequel les accès aux tableaux s'écrivent comme les fonctions, c'est-à-dire que les indices sont aussi entre parenthèses ou pou lequel il est inutile de mettre des parenthèses quand on appele une fonction sans arguments qui est alors écrite comme l'accès à une variable). Pour les autres conventions d'écriture, il me semble que chacun est libre de ne pas prendre C comme norme d'écriture et que l'essentiel est d'être consistent. Quant au risque d'initier le dispatch sur des noms de variable contenant un point, je vous rappellerai qu'il est nécessaire que la variable désigne un objet de type 'function' pour cela.

    Amicalement

  5. #5
    Membre actif
    Homme Profil pro
    Bioinformaticien
    Inscrit en
    Octobre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 126
    Points : 296
    Points
    296
    Par défaut
    Bonjour faubry,
    Visiblement, je me suis très mal exprimé, dommage. D'emblée, je trouvais que c'est [...] une excellente chose [d'] encourager [les conventions de style pour éviter] notamment [de polluer] l'espace des noms de base [la liste standard des espaces de noms (search path) ...] J'espère que c'est plus clair ainsi. Bref, oui, il faudrait bannir des identificateurs à la det. Cependant, ça ne va pas être aisé de prendre suffisamment de précautions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sapply(search(), function(x) length(ls(pos = x, all.names = TRUE)))
           .GlobalEnv     package:stats  package:graphics package:grDevices 
                    0               452                88               108 
        package:utils  package:datasets   package:methods         Autoloads 
                  207               104               379                 1 
         package:base 
                 1307 
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sum(sapply(search(), function(x) length(ls(pos = x, all.names = TRUE))))
    [1] 2646

    Quant aux points séparant des identificateurs à plusieurs mots, je retiens que nous sommes au moins (presque) d'accord sur le nommage des fonctions (et méthodes). Vous semblez être du même avis avec le style de Google : des points pour les variables, autre chose pour les fonctions. Il y a aussi les recommandations


    Bref, désolé donc du malentendu et que galostroy veuille pardonner la pollution de son fil.

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