Boucle dans boucle sous R

Tout ce qui concerne notamment les outils de calcul numérique, de calcul formel ou de géométrie.
[participation réservée aux utilisateurs inscrits]
Règles du forum
Merci de soigner la rédaction de vos messages et de consulter ce sujet avant de poster. Pensez également à utiliser la fonction recherche du forum.
M2_bio

Boucle dans boucle sous R

Message non lu par M2_bio »

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
A.D.

Re: Boucle dans boucle sous R

Message non lu par A.D. »

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.
M2_bio

Re: Boucle dans boucle sous R

Message non lu par M2_bio »

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!
A.D.

Re: Boucle dans boucle sous R

Message non lu par A.D. »

De rien, contente d'avoir pu vous aider :)
mikail78

Re: Boucle dans boucle sous R

Message non lu par mikail78 »

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.
raphkebab
Utilisateur éprouvé
Utilisateur éprouvé
Messages : 227
Inscription : mardi 31 décembre 2013, 12:37
Localisation : Caen

Re: Boucle dans boucle sous R

Message non lu par raphkebab »

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.