pb indexation dans une boucle

Questions sur les objets de R et la manipulation des données

Modérateur : Groupe des modérateurs

Sébastien Hamel
Messages : 71
Enregistré le : 11 Mai 2006, 08:00

pb indexation dans une boucle

Messagepar Sébastien Hamel » 11 Mai 2006, 09:00

Mon problème est le suivant:
Je souhaiterais pouvoir sauvegarder en memoire les PIi (ligne 9:>)de façon à effectuer par la suite un calcul grace à eux (ligne 16:>).
En fait le systeme d'indexation me permettrais de les sauvegarder automatiquement en mémoire mais le problème à mon avis (bien que je sois débutant!!) é que l'on ne peut indexer un nom d'objet. De ce fait, a chaque itération, mes PIi (ligne9:>) sont écrasé par le ssuivants....!!

Koment faire pour indexer un nom d'objet?
Est-ce tout d'abord possible?
QQ'un a-t-il une solution ou une autre méthode pour mon problème?

Remarque: mon test (ligne 4:>) ne doit pas servir à grand choses, mais c le ka ou!!! lol

Programme:

1:> cat("==> nombre de classes :", fill = TRUE)
2:> nbre_classe <- scan(n=1)
3:> for (i in seq (from=1, to=nbre_classe, by=1)) {
4:> if (i <= nbre_classe && i >= 1) {
5:> cat("==> iteration = ",i, "\n")
6:> cat("==> entrez les numeros de colonne de la classe PI",i,":\n")
7:> num_col_PI <- c(scan()) #je rentre lé numéro de colonne à prendre en compte
8:> occupationS <- occupation[,num_col_PI] #je copie lé colonne en fonction numéro précédent dans un objet
9:> PIi <- matrix (apply (occupationS, 2, '+'), ((rowEPI - rowSPI)+1), ((colEPI - colSPI)+1)) #jeffectue le calcul pour caractériser mé "PIi"
10:> #fix(PIi)
11:> } else {
12:> stop("There is a problem !")
13:> }
14:> }

16:> TOTAL <- apply(PIi, 2, '+') #pr en fait réaliser: TOTAL = PI1+PI2+PI3 si nbre_classe = 3 faisant donc varier i de 1 à 3.

Merci davance pr vos précisions apporter

Cordialement

Pierre Bady
Messages : 405
Enregistré le : 02 Mai 2006, 07:46

Messagepar Pierre Bady » 11 Mai 2006, 11:20

Bonjour,

Je pense que tu veux faire trop de chose à la fois. En Programmation orientée objet (d’ailleurs c’est même en général), il faut diviser pour mieux régner.

# Dans un premier temps, tu peux construire une fonction qui caractérise tes PIi
DesCol <- function(df){
PIi <- matrix (apply (df, 2, '+'), ((rowEPI - rowSPI)+1), ((colEPI - colSPI)+1))
return(PIi)
}


# Dans un second temps, tu peux construire ta boucle :
nbreclasse <- n

lw <- list()

for(i in 1 : nbreclasse){
cat("iter = ",i, "\n")
cat("numeros de colonne de la classe PI",i,":\n")
nc <- c(scan())

w <- DesCol(df=occupation[,nc])

lw[[i]] <- w
}

# et enfin, tu peux calculer ton total. Tes valeurs sont stockés dans lw.

Tu n’est pas obliger d’utiliser une liste pour stocker les résultats
Mais, j’ai du mal à voir ce qui sort de la fonction DesCol (quelles dimensions ?).


Par contre, il me semble qu’il faut éviter d’utiliser le signe ‘_ ‘, c’est un ancien signe d’affectation, donc c’est tjs perturbant de le voir se balader dans un code :)
N’hésite pas à décortiquer les calculs.
Ça simplifie la lecture et ça permet de mieux localiser les erreurs.

sinon, je n’ai pas vraiment compris ton script :(

j’espère que cela t’aidera un peu

@+

pierre

Sébastien Hamel
Messages : 71
Enregistré le : 11 Mai 2006, 08:00

Messagepar Sébastien Hamel » 11 Mai 2006, 11:48

Pierre Bady a écrit :Bonjour,

Je pense que tu veux faire trop de chose à la fois. En Programmation orientée objet (d’ailleurs c’est même en général), il faut diviser pour mieux régner.

# Dans un premier temps, tu peux construire une fonction qui caractérise tes PIi
DesCol <- function(df){
PIi <- matrix (apply (df, 2, '+'), ((rowEPI - rowSPI)+1), ((colEPI - colSPI)+1))
return(PIi)
}


# Dans un second temps, tu peux construire ta boucle :
nbreclasse <- n

lw <- list()

for(i in 1 : nbreclasse){
cat("iter = ",i, "\n")
cat("numeros de colonne de la classe PI",i,":\n")
nc <- c(scan())

w <- DesCol(df=occupation[,nc])

lw[[i]] <- w
}

# et enfin, tu peux calculer ton total. Tes valeurs sont stockés dans lw.

Tu n’est pas obliger d’utiliser une liste pour stocker les résultats
Mais, j’ai du mal à voir ce qui sort de la fonction DesCol (quelles dimensions ?).


Par contre, il me semble qu’il faut éviter d’utiliser le signe ‘_ ‘, c’est un ancien signe d’affectation, donc c’est tjs perturbant de le voir se balader dans un code :)
N’hésite pas à décortiquer les calculs.
Ça simplifie la lecture et ça permet de mieux localiser les erreurs.

sinon, je n’ai pas vraiment compris ton script :(

j’espère que cela t’aidera un peu

@+

pierre


En fait, je travaille à partir d'un fichier .txt :

cat("==> chemin d'acces au fichier occupation du sol = '.txt':", fill = TRUE)
y <- scan(n=1, what = 'character')
occupation <- read.table(y, head = TRUE, sep = "")

dont je précise l'itinéraire dans l'objet "y". Ce fichier (d'occupation du sol d'une région donnée) contient des numéros de colonnes qui caractérisent mes classes "PIi" (par exemple: colonne 1=pelouse->PI1, colonne 2=sol nu->PI2, colonne 3=argile->PI1, etc.) qui m'interessent par la suite.
La dimension des "PIi" dépend de la région considérée:
rowEPI=valeur coordonnée de la ligne de départ
rowSPI=valeur coordonnée de la ligne de fin
colEPI=valeur coordonnée de la colonne de départ
colSPI=valeur coordonnée de la colonne de fin
ALors ma matrice "PIi" a pour dimension 202*222 pixels par exemple.
Je stocke donc une matrice de valeurs qui a la dimension de la région considérée dans mes "PIi".

Donc je classe chacune de mes colonnes dans les "PIi" correspondant afin de faire le calcul "TOTAL" ensuite.

Je ne sais pas si je suis vraiment clair dans mon propos!!

je vé testé ce que tu ma écrit

merci encore Pierre

Sébastien Hamel
Messages : 71
Enregistré le : 11 Mai 2006, 08:00

Messagepar Sébastien Hamel » 11 Mai 2006, 12:04

Mon principal probleme est que je voulais incrémenter dans ma boucle le "i" de "PIi" de façon a caractériser respectivement le PI1 du PI2 et ainsi de suite..... sauf que je m'aperçois que c'est pas possible car on ne peut pas vraisemblablement incrémenter un nom d'objet!!
Le résultat que j'obtiens avec mon putain de programme pour rester polie est que j'écrase les "PIi" initiaux pour ne garder que le "PIi" final (soit PI4 si nbre_classe = 4 mais ce né pas le cas puisque l'on ne peut incrémenter un nom d'objet, donc au bout du compte le résultat final est "PIi"!!!!!)

Sinon le reste tourne bien meme si je ne suis pas un expert en programmation. Je me débrouille comme je peux et je dois dire que c'est pas facile du tout.....

Sébastien Hamel
Messages : 71
Enregistré le : 11 Mai 2006, 08:00

Messagepar Sébastien Hamel » 11 Mai 2006, 12:33

Autre question:

Dans une fonction quelconque que l'on appelle fonction1 et pour laquelle je calcule l'objet X

Comment faire pour utiliser ce meme objet X dans une autre fonction que j'appelerai fonction2?

Faut-il faire source("....") ?

Sébastien Hamel
Messages : 71
Enregistré le : 11 Mai 2006, 08:00

Messagepar Sébastien Hamel » 11 Mai 2006, 13:34

Pierre Bady a écrit :Bonjour,

.......
w <- DesCol(df=occupation[,nc])
......

pierre


Je viens de tester le programme que tu m'a envoyé pierre.
Un pb subsiste:
on me dit : "Erreur dans occupation[, nc] : objet non indiçable"

alors j'ai rajouté la ligne précédemment: occupationS <- occupation[,nc]
pensant que le pb serait résolu kom ca

et now on me dit : "Erreur : échec d'indexation récursive au niveau 1"

Je dois te dire que je ne comprend absolument rien.....

Merci kan mem de ton aide

Si kkun à une idée pour maider, il est le bien venu....

Pierre Bady
Messages : 405
Enregistré le : 02 Mai 2006, 07:46

Messagepar Pierre Bady » 11 Mai 2006, 13:55

rebonjour,


ton problème est pas tres clair.

je pense qu'il faut que tu décomposes ton approche.
et la première étape c'est d'importer ton tableau dans R.

si j’ai bien compris (?),
tu a un tableau de la forme suivante (dans ton fichier texte):

region relevé classes
1 1 1
1 2 2
1 3 3
2 4 2
2 5 2
… … …

avec
si je me trompe, n’hésite pas à me taper sur les doigts :)

si c'est pas cela donne un petite exemple de la forme de ton fichier texte, svp


Pierre

Sébastien Hamel
Messages : 71
Enregistré le : 11 Mai 2006, 08:00

Messagepar Sébastien Hamel » 11 Mai 2006, 14:38

mon tablo '.txt' nommé "occupation" est kome suite:

111 112 121
0.000000e+00 0.000000e+00 0.000000e+00
0.000000e+00 0.000000e+00 0.000000e+00
0.000000e+00 0.000000e+00 0.000000e+00
.......

ligne 1 -> numéro dé colonnes
exemple: PI1 (=classe végétation) = 111 (=herbe) + 122 (=fleur) ....
PI2 (=classe terre) = 112(=argile) + 121(=sable) +...

donc chaque colonne est définie par son numéro et caractérise une valeur d'un pixel dans la région considérée
sachant que la région représente un carrée de 202*222 pixels = 44844 pixels
soit la dimension d'une colonne = un vecteur de 44844 valeurs

ce sont ces colonnes que je cherche à individualiser du tablo pour construire mes matrices:
c'est pourquoi 'occupationS' regroupé toutes les colonnes d'une meme classe
par exemple la matrice PI1 serait constitué de la somme des colonnes 111+122+...soit la dimension de matrice 202 colonnes(=colEPI - colSPI)+1) et 222 lignes(=rowEPI - rowSPI)+1) pour superposé à la région considérée

c'est pourquoi dans mon programme je voulais, par l'intermédiaire du nombre de classe (qui peut varier) rentré par l'utilisateur, incrémenter mes PI (appelé 'PIi' pour que le i s'incrémente tout seul) en fonction du nombre de classe. De la sorte, joré pu faire mon calcul:
TOTAL <- sapply (PIi, '+') bien que maintenant je doute de cette formulation....!!!

Cernes-tu mieux mon problème. Ce dernier réside dans l'incrémentation des "PI" qui n'est pas possible puisqu'ils sont placés en nom d'objets.

J'écoute ta solution PIERRE

Et merci de prendre à coeur mon pb, c'est important pour moi

MERCI POUR TOUT

Voici le programme pr éviter de remonter plus haut ;)

occupation <- read.table(OccupSol, head = TRUE, sep = "")

### Construction des PI(i) ###

cat("==> nombre de classes de PI:", fill = TRUE)
NbreClasse <- scan(n=1)

for (i in seq (from=1, to=NbreClasse, by=1) {
cat("==> iteration = ",i, "\n")
cat("==> entrez les numeros de colonne de la classe PI",i,":\n")
NumColPI <- c(scan())
occupationS <- occupation[,NumColPI]
PIi <- matrix (apply (occupationS, 2, '+'), ((rowEPI - rowSPI)+1), ((colEPI - colSPI)+1))
}

puis il reste: TOTAL <- sapply (PIi, '+') mais je ne sais plus ou l'insérer ni komment!!!.......

Pierre Bady
Messages : 405
Enregistré le : 02 Mai 2006, 07:46

Messagepar Pierre Bady » 11 Mai 2006, 15:49

re ...


J'écoute ta solution PIERRE


Loin de moi, la prétention d'avoir à solution à ton problème.
Je voulais juste essayer de t’aider :(


Donc dans le fichier texte tu as :
Une colonne par type de sol, qui représente un vecteur de taille 44844
(un carrée de 202*222 pixels = 44844 pixels)

Si tu importes ton fichier dans R, tu as une matrix (ou un data.frame) qui a les dimensions suivantes : 44844 lignes x NbDeTypeDeSol colonnes.

Je vais essayer de te proposer un example :

##### example

# Definition de notre région :
# format matrice
region <- matrix(1:42,6,7)
# format vecteur
region <- as.vector(region)

# preparation du tableau de relevé
tab1 <- as.data.frame(cbind(rnorm(42),rnorm(42),rnorm(42),rnorm(42),rnorm(42)))
names(tab1) <- c("pelouse","herbe","sable","argile","glaise")

# on a 5 vecteurs (type de sol) qui correspondent
# à une matrice déroulée de dimension 6*7

# construction d’une liste de matrice par type de sol
listmat <- lapply(tab1,function(x) matrix(x,6,7))
listmat

par(mfrow=c(2,3))
lapply(listmat,function(x) table.paint(x)

# on construit un vecteur pour regrouper le type de sol
selec1 <- c("veg","veg","terre","terre","terre")
names(selec1) <- c("pelouse","herbe","sable","argile","glaise")
selec1

# maintenant on reconstruit une matrice
# par grand type de sol (“veg” ou ”terre”)
# pour cela on reprend notre tableau ‘tab1 ‘
# pour les ‘veg’ :
veg <- apply(tab1[,selec1=="veg"],1,sum)
# on construit la matrice veg
matveg <- matrix(veg,6,7)
matveg
table.paint(matveg)

# pour les ‘terre’ :
# on utilise la même procédure
terre <- apply(tab1[,selec1=="terre"],1,sum)
matterre <- matrix(terre,6,7)
matterre
table.paint(matterre)

#### end

les points clés sont la construction du vecteur « selec1 » qui va permettre de regrouper les types de sol par catégories (ex. vegetaux, terres, …).
Ensuite je te conseille de remplacer les code 122,111, etc … par les noms des classes. C’est peut-être un peu lourd, mais ça clarifie la situation.


J’espère ne pas être trop à coté de la plaque :)


@+++


Pierre

Sébastien Hamel
Messages : 71
Enregistré le : 11 Mai 2006, 08:00

Messagepar Sébastien Hamel » 12 Mai 2006, 06:30

Ok Pierre, ca ma l'air pas mal ce truc la... Il faudrait juste que cette procédure soit automatique, donc que l'utilisateur entre un nombre de classe donnée et en fonction de celui-ci le programme lui propose de rentrer à la main le nom des classes et colonnes!!... Et ainsi de suite...

Mais je vais essayer de bidouyer cela.

Je voudrais juste que tu me précise 2 choses:

-> Est-il possible d'incrémenter un nom d'objet dans une boucle?

-> Si j'ai un objet X calculé dans une fonction 1 et que je souhaite utiliser le résultat de l'objet X dans une fonction 2, comment dois-je faire?

Merci

Sébastien Hamel
Messages : 71
Enregistré le : 11 Mai 2006, 08:00

Messagepar Sébastien Hamel » 12 Mai 2006, 06:59

re ...
# construction d’une liste de matrice par type de sol
listmat <- lapply(tab1,function(x) matrix(x,6,7))
listmat

par(mfrow=c(2,3))
lapply(listmat,function(x) table.paint(x)



Un dernier point: Qu'est-ce que c'est que ta function(x).........?

Sébastien Hamel
Messages : 71
Enregistré le : 11 Mai 2006, 08:00

Messagepar Sébastien Hamel » 12 Mai 2006, 07:18

Pierre,

Pourrais-tu préciser s'il faut utiliser une librairie spéciale pour faire fonctionner table.paint() ?

Cordialement,

Pierre Bady
Messages : 405
Enregistré le : 02 Mai 2006, 07:46

Messagepar Pierre Bady » 12 Mai 2006, 08:08

bonjour,

Pourrais-tu préciser s'il faut utiliser une librairie spéciale pour faire fonctionner table.paint() ?


excuse -moi ... il faut utiliser la librairie ade4 :

library(ade4)


pierre


PS: il me semble que l'on flood un peu ... J'espère que cela ne pose pas de pb :?:

Pierre Bady
Messages : 405
Enregistré le : 02 Mai 2006, 07:46

Messagepar Pierre Bady » 12 Mai 2006, 08:23

re ...

Un dernier point: Qu'est-ce que c'est que ta function(x).........?


l’objet ‘tab1’ est un ‘data.frame’ qui correspond à une liste de vecteur.
la commande ‘lapply’ va permettre d'appliquer la même opération sur chacun des éléments de tab1. Dans notre cas, on va prendre chaque vecteur et on va les transformer en matrice un par un. Le ‘function(x)’ sert à indiquer l’opération qui sera effectué sur chaque élément (x) de tab1.

Tu peux consulter la doc concernant ces fonctions :
?lapply
?apply
?tapply
?sapply
?mapply



pierre

Sébastien Hamel
Messages : 71
Enregistré le : 11 Mai 2006, 08:00

Messagepar Sébastien Hamel » 12 Mai 2006, 10:45

J’espère ne pas être trop à coté de la plaque :)


Tu né pa du tout a coté de la plaque, c exactement ca!

Il fo juste que j'arriv now à automatiser l'écriture de chaque matrice:

par exemple l'utilisateur rentre le nombre de type de sol & les noms de type de sol pour construire les matrices
-> NbreTypeSol <- scan(n=1)
-> scan(n=NbreTypeSol, what='character') donc par exemple
1: "veg"
2: "terre"

é qu'une fonction écrive la matrice correspondante automatiquement en allan puisser les valeurs ou il faut!! A l'aide d'une boucle ou non ca aprè je ne sais pa!!

Parce ke le truc c kil fo que ce soi automatique donc si je rentre comme tu me di:
->veg <- apply(tab1[,selec1=="veg"],1,sum)
->matveg <- matrix(veg,6,7)

et pareil pour "terre", il ny a rien dautomatique

Il fo savoir que les fichier '.txt' varieron, donc ne seron pas constan dans le nombreTypeSol (ca pe importe tu me dira car lutilisateur rentre lui meme ces noms, tu a résolu ce pb), mé comme ce nombre et rattacher indirectement au nombre de matrices que tu rentre dans le programme toi a la main (par exemple TypeSol "veg" correspond matrice "matveg"), dan limmédia on é coincé...

Cela suppose ke tu connaisse déjà le nombre de matrice é le nom des type de sol à l'avance or ce ne sera pa le ka vu que lé fichier '.txt' ne seron jamé lé mem...

Par exemple, si le nom des type de sol change, la construction des matrices n'é plu possible car elle dépen du caractère "veg" qu'elle ne trouvera plu car les noms oron changé si g bien compris...

Mé je ne vois pa komen faire pr automatiser cette tache!!

La construction des matrices est visiblement la mem pour toute!! Mé si on insère cette construction de matrice dans une boucle en faisan varier le 'i', le pb seré résolu. C ce que jessai de faire mé ni arriv pa car impossible d'incrémenter un nom d'objet ou paramètres non indiçable....
En fait il fodré faire une boucle pour construire les matrices é les sauver une par une -> l'utilisateur oré juste besoin de rentrer le nombre de matrices nécessaires é le noms de chacunes pour puisser les info correspondantes dans ce ki a été fé avant....

Je suis un boulet.... (G l'impression kon ne fé pa tou ce kon ve avec les incrémentation dan une boucle, surtou pour des nom d'objet, ca seré tellemen plu simple si cela été possible car d'une part les matrices serai construite une par une é on pourré les appelés sans pb pour effectuer un calcul aprè)


Retourner vers « Archives : Manipulation de données avec R »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité