Indiçage dans une boucle dans R/Splus

From: Patrick Giraudoux (patrick.giraudoux@univ-fcomte.fr)
Date: Sun Nov 09 2003 - 12:56:58 MET


Bonjour,

Je me trouve confronté à un problème de programmation dans R (en fait Splus) que certains ade-listeurs (notamment D. Chessel) pourraient pouvoir (?) aider à résoudre. J'essaie d'implémenter une fonction utilisant cor.test pour créer, à partir d'un data.frame dont les colonnes sont des variables, une matrice de corrélation (de tous types: Pearson, Spearman, Kendall) ou de probabilité de ces corrélations ou de tout autre paramètre d'intérêt lié à ces corrélations (ce que n'assure pas "cor"). Le prototype est écrit ainsi:

cor.mat<-function(donnees){
noms<-names(donnees) # récupère les noms des colonnes du data.frame

# crée une matrice carrée "nombre de noms x nombre de noms"
cells<-matrix(data=rep(0,length(noms)^2),nrow=length(noms),ncol=length(noms))

# stocke dans la partie diagonale haute et droite les valeurs de r (ou plus tard, toute autre valeur d'intérêt)
debut<-1
for (i in debut:length(noms)-1){
for (j in i+1:(length(noms)-i)){
cells[i,j]<-cor.test(donnees[,i],donnees[,j])$estimate
}
debut<-debut+1
}
return(cells)
}

Le problème tient au passage de la variable i et j d'incrémentation des boucles for... pour l'indicage du tableau dans:

cells[i,j]<-cor.test(donnees[,i],donnees[,j])$estimate

L'exécution me renvoie:

> x<-cor.mat(donnees)
Error in "[.data.frame"(donnees, , i): no columns selected

J'ai essayé de simplifier de mille façons. Notamment en ne passant que:

cells[i,j]<-donnees[,i]

Ce qui n'est pas prétentieux même si non relevant pour la finalité du programme... mais j'ai toujours ce même message:

> x<-cor.mat(donnees)
Error in "[.data.frame"(donnees, , i): no columns selected

Bref, l'indice n'est pas reconnu dans l'expression... même si je remplace i, j par d'autres variables a, b auxquelles les valeurs i,j auraient été affectées. Tout fonctionne par contre si je remplace i et j par un chiffre d'indice écrit à la main... On a donc bien un problème de passage des variables i,j en indice de tableau. J'ai souvenir d'avoir déjà rencontré un tel type de problème (passage de la valeur du compteur en indice d'un tableau dans un une boucle), mais je ne me souviens pas de l'avoir résolu avec pertinence, ni même résolu du tout!

Quelqu'un aurait-il rencontré le même problème, et l'aurait-il résolu?

Bien amicalement à tous,

Patrick Giraudoux



This archive was generated by hypermail 2b30 : Tue Sep 07 2004 - 13:45:25 MEST