Boucle dans boucle sous R

Tout ce qui concerne les différents logiciels mathématiques (Matlab, Maxima, Scilab, R, Maple, Mathematica, ...) et les calculatrices scientifiques.
Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.
> Préciser le nom du logiciel concerné dans le titre de votre message.

Boucle dans boucle sous R

Messagepar M2_bio » Jeudi 24 Février 2011, 17:42

Bonjour,

Je suis novice sous R, et j'ai fait un script pour une boucle qui semble avoir un problème que je n'arrive pas a résoudre, j'utilise plusieurs boucles imbriquées et j'ai l'impression qu'elles ne fonctionnent pas dans l'ordre dans lequel je le voudrais.

Je vous explique d'abord mes données:
J'ai une fichier contenant en lignes mes échantillons et en colonnes les valeurs mesurées:
Code: Tout sélectionner
> met
    plaque ech repet    m Prot-µg Prot-µgnorm Glu-µmol Glu-mg
1        I   0    13 20.0   5.010        12.2     66.5   12.0
2        I   0    38 19.8   5.060        12.3     48.7    8.8


Je veux traiter mes échantillons 6 par 6 (c'est comme ça que sont fait mes répliquas biologiques), et ça pour toutes les colonnes en même temps. Donc j'ai fait le script suivant, avec pour commencer les moyennes et les écarts types (le script est basique et je suis sure que l'on peut écrire ça plus facilement, mais je débute):
Code: Tout sélectionner
####Avec une boucle pour toutes les condition et les colonnes:
#vider les vecteur qui vont recevoir les valeurs calculées:
Statx=NULL
Statq=NULL

#Creer le vecteur contenant les lignes que je veux analyser:
x<-met[(7:180),]
x<- x[-c(85:90),]

#Creer un vecteur me permetant de faire "sauter des lignes" a la boucle:
step1<- c(0,6,12,18,24,30,36,42,48,54,60,66,72,78,84,90,96,100,106,112,118)

#1ere boucle pour changer de ligne:
for (j in step1)
{

#Creer un vecteur contenant les numéros des colones que je veux analyser:
y<-c(5:20)

#2nd boucle pour changer de colonne:
for (q in y )
{

#sortir la moyenne des 6 lignes sélectionnées:
moy <- mean(x [((1+j):(6+j)),q])

#sortir l'écart type des 6 lignes sélectionnées:
ed <- sd(x [((1+j):(6+j)),q])

# coler ces valeurs en tant que colonne d'une matrice
ci <- cbind(moy, ed)

# coler ces valeurs en tant que colonne d'une matrice a chaque itération de changement de colone ds le vecteur pere:
Statq<-cbind(Statq,ci)
}

# coler ces valeurs en tant que lignes d'une matrice a chaque itération de changement de ligne ds le vecteur pere:
Statx<-rbind(Statx,Statq)
}

##Enregistrer la matrice dans un fichier Excel:
write.table(Statx, file = 'StatX.xls', append = FALSE, quote = TRUE, sep = "\t",
            eol = "\r\n", na = " ", dec = ".", row.names = TRUE,
            col.names = TRUE)

Voila l'erreur que R me retourne:
Code: Tout sélectionner
Erreur dans rbind(Statx, Statq) :
  le nombre de colonnes des matrices doit correspondre (voir argument 2)

Or lorsque je regarde mes vecteur Statq et Statx , Statx contient une itération (les valeurs moy et ed pour les 15 colonnes et les 6 premières lignes) et Statq contient 2 itération sur une même ligne.
Je pense qu'il suffit que je fasse vider le contenu de Statq a la fin de la boucle "changement de colonne du vecteur père", mais je ne sais pas ou le placer exactement (j'ai essayé ça fait n'importe quoi..)

Une idée pour arranger mon problème??

Merci
M2_bio
Utilisateur
 
Messages: 2
Inscription: Jeudi 24 Février 2011, 17:11
Statut actuel: Post-bac | Master

Publicité

Re: Boucle dans boucle sous R

Messagepar A.D. » Vendredi 25 Février 2011, 10:34

Bonjour,


Pas facile de lancer votre code sans jeu de données mais si le problème vient de la remise à zéro de la variable "Statq" (ce qui est probablement le cas), je vous conseille de réinitialiser cette variable juste après :

Code: Tout sélectionner
Statx<-rbind(Statx,Statq)


De plus, quelques remarques :

1°/ Vous créez le vecteur y<-c(5:20) à l'intérieur de la boucle alors qu'il est constant. Il est donc recréé à chaque nouvelle itération j, ce qui est inutile.

2°/ Plutôt que de créer le vecteur "step1" et ensuite de devoir jouer avec les indices des lignes de x pour sélectionner les éléments souhaités, il est aussi possible de procéder ainsi :

Code: Tout sélectionner
rp<-gl(21,6)
rp
  [1] 1  1  1  1  1  1  2  2  2  2  2  2  3  3  3  3  3  3  4  4  4  4  4  4  5
 [26] 5  5  5  5  5  6  6  6  6  6  6  7  7  7  7  7  7  8  8  8  8  8  8  9  9
 [51] 9  9  9  9  10 10 10 10 10 10 11 11 11 11 11 11 12 12 12 12 12 12 13 13 13
 [76] 13 13 13 14 14 14 14 14 14 15 15 15 15 15 15 16 16 16 16 16 16 17 17 17 17
[101] 17 17 18 18 18 18 18 18 19 19 19 19 19 19 20 20 20 20 20 20 21 21 21 21 21
[126] 21

x<-cbind(x,rp)

Puis au lieu de faire une boucle sur step1 faire une boucle pour j variant de 1 à 21 (nb: j'ai choisi le nombre 21 car il me semblait d'après le descriptif de step1 que vous disposiez de 21 réplicats mais si ce n'est pas le cas, il faudra adapter), et pour sélectionner les éléments voulu dans x faire (à l'intérieur de la boucle) :

Code: Tout sélectionner
x [ x$rp==j , q ]


En espérant que cela vous aide.
Bonne continuation :)


Cordialement,

A.D.
A.D.
Hecto-utilisateur
 
Messages: 56
Inscription: Jeudi 16 Octobre 2008, 17:59
Localisation: Nantes
Statut actuel: Actif et salarié

Re: Boucle dans boucle sous R

Messagepar M2_bio » Vendredi 25 Février 2011, 13:46

Merci,

Effectivement lorsque je remet a zéro la variable Statq a ce niveau là tout fonctionne.
Pour vos autres remarques, elle m'aident vraiment a simplifier mon script surtout qu'une erreur c'était glissée dans mon vecteur Step1 (je ne sais apparemment pas compter ^^) donc avec votre méthode je suis sure qu'il n'y en a pas.

Encore, merci d'avoir si facilement résolus mes problèmes!
M2_bio
Utilisateur
 
Messages: 2
Inscription: Jeudi 24 Février 2011, 17:11
Statut actuel: Post-bac | Master

Re: Boucle dans boucle sous R

Messagepar A.D. » Vendredi 25 Février 2011, 14:24

De rien, contente d'avoir pu vous aider :)
A.D.
Hecto-utilisateur
 
Messages: 56
Inscription: Jeudi 16 Octobre 2008, 17:59
Localisation: Nantes
Statut actuel: Actif et salarié

Re: Boucle dans boucle sous R

Messagepar mikail78 » Mercredi 29 Juin 2016, 09:03

bonjour,
j'ai un énorme problème, je doit crée un programme avec le logiciel R qui me permet de croisée différente colonne automatiquement c'est à dire croisé la colonne 1 avec la colonne 2, ensuite la colonne 1 avec la colonne 2, colonne 1 avec la 3 ect ec, avec la colonne 1 comme colonne de base en gros je doit croisée la colonne 1 avec toute les autres colonnes.
Et le problème c'est que je manque d'éxpérience avec ce logiciel, je galère et j'y arrive pas ( je suis en entreprise ce n'est pas dans le cadre d'un projet à l'école)
Si quelq'un pourrais m'aidé please.
mikail78
Utilisateur
 
Messages: 1
Inscription: Mercredi 29 Juin 2016, 08:49
Statut actuel: Post-bac | IUT ou IUP

Re: Boucle dans boucle sous R

Messagepar raphkebab » Mercredi 29 Juin 2016, 15:44

Voici un exemple simple.

#table de l'exemple
a=c("a1","a1","a2")
b=c("b1","b2","b1")
c=c("c1","c2","c2")
data.test=data.frame(a,b,c)

#le calcul (changer le nom de la table, la variable de référence et bien la placer en première position)
res=lapply(data.test[,2:dim(data.test)], function(x) table(data.test$a,x))


Le résultat final est une liste.
raphkebab
Kilo-utilisateur
 
Messages: 210
Inscription: Mardi 31 Décembre 2013, 12:37
Localisation: Caen
Statut actuel: Post-bac | Doctorat


Retourner vers Logiciels mathématiques

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités