Liste de matrices

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

Liste de matrices

Messagepar Sébastien Hamel » 16 Mai 2006, 08:51

Je souhaite effectuer une opération sur 2 éléments contenus dans une list:

élément 1: <-> matrice avec nrow=6 & ncol=7 soit length=42
>listmat$veget
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] -1.8995373 1.0016635 -1.7035262 1.15715295 0.73531510 -0.08069642 -1.6381454
[2,] 1.1774941 0.1749488 -0.5861605 -0.38931458 0.17227681 1.24687755 1.4103853
[3,] 3.1119065 0.6805140 1.2030366 -0.06143505 -0.05298626 0.98152916 0.6735722
[4,] -2.1366878 2.6796017 1.4944670 -2.75851985 1.66844907 3.24520135 -2.4194144
[5,] -2.3843689 2.2161629 0.2335551 -1.46599313 -1.76943615 -2.41044441 0.5069014
[6,] -0.4482077 -1.3665511 0.8179861 -0.80314219 -0.06947649 2.56695455 -0.9596487

élément 2: <-> matrice avec nrow=6 & ncol=7 soit length=42
> listmat$ter
[,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,] 2.1832076 0.3238283 0.7689048 -2.4445775 1.3286783 -1.3148006 -1.0282753
[2,] -1.3120374 1.4887914 1.2614013 0.8651307 -2.3111745 -0.7289684 2.0365191
[3,] -1.0434175 -0.7489509 3.1147066 0.8448633 -0.5036640 2.2065120 1.2408313
[4,] -2.6577481 0.5737944 0.8146723 2.1765601 0.7110672 -2.2339904 -2.4579524
[5,] -3.0806857 2.0995548 -1.1339637 0.1382737 -0.7785043 -0.7291701 2.7570673
[6,] 0.1087277 -2.8318159 1.1109853 -1.8222314 0.8232295 -1.6062348 0.9238962

Opération à effectuer:
> ESSAI1 <- apply(c(scan(n=2, what='character')), 1, sum)
1: listmat$veget
2: listmat$ter

l'opération semble simple & sans pb mais voici ce que m'affiche la console de R

Message d'erreur:
>Erreur dans apply(c(scan(n = 2, what = "character")), 1, sum) :
dim(X) doit avoir un longueur positive

or dim(X)=length (X)=42 si je ne m'abuse
donc d'ou vient le pb?

Kkun oré t-il une idée?

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 16 Mai 2006, 17:16

Je ne comprends pas quelle opération vous voulez effectuer. Merci de décrire avec des mots, voire de donner un micro-exemple avec les éléments de départ et le résultat attendu.

Renaud

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

Messagepar Sébastien Hamel » 17 Mai 2006, 06:16

Renaud Lancelot a écrit :Je ne comprends pas quelle opération vous voulez effectuer. Merci de décrire avec des mots, voire de donner un micro-exemple avec les éléments de départ et le résultat attendu.

Renaud


Les éléments de départ sont mes 2 matrices présentent dans la listmat (=nom de la liste) que je vais saisir dans la console R en écrivant respectivement leur nom (grace à c(scan(n=2, what='character'))) afin que dans l'objet que j'appelle ESSAI1, j'obtienne la somme terme à terme de mes 2 matrices, à savoir listmat$veget & listmat$ter.
ESSAI1 aura donc la meme dimension que mes 2 matrices

ESSAI = listmat$veget + listmat$ter

sauf que dans mon cas la saisie est automatique si je puis dire!....

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 17 Mai 2006, 07:11

Comme ça ?

Code : Tout sélectionner

> Liste <- list(m1 = matrix(1:4, ncol = 2), m2 = matrix(5:8, ncol = 2), m3 = matrix(9:12, ncol = 2))
> Liste
$m1
     [,1] [,2]
[1,]    1    3
[2,]    2    4

$m2
     [,1] [,2]
[1,]    5    7
[2,]    6    8

$m3
     [,1] [,2]
[1,]    9   11
[2,]   10   12

>
> choix <- scan(n = 2, what = 'character')
1: m1
2: m3
Read 2 items
> do.call("+", Liste[choix])
     [,1] [,2]
[1,]   10   14
[2,]   12   16


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

Messagepar Sébastien Hamel » 17 Mai 2006, 13:15

Renaud Lancelot a écrit :Comme ça ?


G essayé le code que tu ma donné é je lai appliqué a mon ka:

a savoir:

listmat[[total]] <- do.call ("+", listmat[c(scan(n=NbreMatrice, what='character'))])
names(listmat)[total] <- paste (scan(n=1, what='character'), total, sep=";") ==> m3 par exemple

ou total vaut 3 donc ajout d'une nouvelle matrice a la suite des 2 premieres
listmat est la liste dans lequel figure des matrices
-> listmat$m1 a pour dimension nrow=6 & ncol=7
-> listmat$m2 de meme

et lorsque j'affiche listmat, j'obtien:
$m1;1 je ne mets pa lé détails: matrice de dim 6 par 7
$m2;2 idem
$m3;3 numeric(0) !!!!!!!!

why numeric (0)? alors que je devré avoir une matrice de dim 6 par 7 avec la somme des termes à l'interieur......

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 17 Mai 2006, 17:09

J'ai changé l'intitulé du message d'origine pour le rendre plus explicite. J'espère que tu t'y retrouveras.

Ton code est difficile à lire. Il vaut mieux le décomposer en plusieurs étapes plutôt que de tout vouloir faire en une seule fois. Si ton objectif est de faire une fonction, je suis sûr que dans quelques jours tu ne comprendras plus toi-même ce que tu as voulu faire. Fin du sermon. et exemple de code qui marche:

Code : Tout sélectionner

> listmat <- list(m1 = matrix(1:4, ncol = 2), m2 = matrix(5:8, ncol = 2))
> NbreMatrice <- length(listmat)
>
> choix <- scan(n = NbreMatrice, what = 'character')
1: m1
2: m2
Read 2 items
>
> total <- NbreMatrice + 1
> listmat[[total]] <- do.call ("+", listmat[choix])
>
> listmat
$m1
     [,1] [,2]
[1,]    1    3
[2,]    2    4

$m2
     [,1] [,2]
[1,]    5    7
[2,]    6    8

[[3]]
     [,1] [,2]
[1,]    6   10
[2,]    8   12

> names(listmat)[total] <- paste(scan(n = 1, what = 'character'), total, sep = "")
1: m
Read 1 item
> listmat
$m1
     [,1] [,2]
[1,]    1    3
[2,]    2    4

$m2
     [,1] [,2]
[1,]    5    7
[2,]    6    8

$m3
     [,1] [,2]
[1,]    6   10
[2,]    8   12

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

Messagepar Sébastien Hamel » 18 Mai 2006, 10:13

Renaud Lancelot a écrit :J'ai changé l'intitulé....


Ok, je viens de procéder par étape comme tu me la conseillé.

Néanmoins, le code:

do.call ("+", listmat[choix])

fonctionne trés bien mais que si l'on rentre deux nom de matrice dans l'objet choix. Si on était ammener a rentrer plus de deux noms de matrice pour faire la somme

par exemple rentrer: m1, m2, m3, m4
pour faire: m1 + m2 + m3 + m4

é bien la console R nous dit que:

Erreur dans do.call("+", listmat[choix]) : l'opérateur a besoin d'un ou de deux arguments

Aurais-tu une autre solution a me proposer pour faire une somme de plusieurs matrice présente dans une liste?

car moi j'ai essayé en faisant:

nom <- scan(n=length(listmat), what='character')
listmatTotal <- apply (listmat[nom], 1, sum)

mais la console retourne:

Erreur dans apply(listmat[nom], 1, sum) : dim(X) doit avoir un longueur positive

Autre question:
Est-ce que cela serait également réalisable pour une opération de division mais cette fois-ci seulement entre 2 matrices (ce qui semble plus logique dailleurs!!! lol)

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 18 Mai 2006, 11:09

Aurais-tu une autre solution a me proposer pour faire une somme de plusieurs matrice présente dans une liste?


Par exemple;

Code : Tout sélectionner

> listmat <- list(m1 = matrix(1:4, ncol = 2),
+                 m2 = matrix(5:8, ncol = 2),
+                 m3 = matrix(9:12, ncol = 2),
+                 m4 = matrix(13:16, ncol = 2))
>
> for(i in seq(length(listmat)))
+   X <- if(i == 1) listmat[[i]] else X + listmat[[i]]
>
> X
     [,1] [,2]
[1,]   28   36
[2,]   32   40



Autre question:
Est-ce que cela serait également réalisable pour une opération de division mais cette fois-ci seulement entre 2 matrices (ce qui semble plus logique dailleurs!!! lol)


Tu veux faire une division cellule par cellule ?

Code : Tout sélectionner

> matrix(1:4, ncol = 2) / matrix(1:4, ncol = 2)
     [,1] [,2]
[1,]    1    1
[2,]    1    1



Renaud

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

Messagepar Sébastien Hamel » 19 Mai 2006, 07:32

Ok, merci, ca marche nickel cette opération.

Une derniere chose:

Crois-tu qu'il serait possible d'effectuer le meme type d'opération avec le nom des colonnes des matrices?

si par exemple ma matrice possède 10 colonnes dont je connais les noms a l'avance, et que je souhaite faire les sommes suivantes:
col1 + col3 + col4 + col10
col2 + col6 +col8 + col9
col5 + col7

cela pour dire que l'on ne connait pas a l'avance les colonnes qu'il faut ajouter entre elle.
Le mieux serait-il de creer des objets contenant respectivement le noms des colonnes à ajouter entre elle?
ou bien fodrait-il creer une liste par exemple listNomAggreg dans laquelle listNomAggreg[[1]] possederé les nom des colonnes pour l'opération 1 & ainsi de suite?

Pour tout te dire, je suis parti sur cette derniere solution mais apparemment j'ai un pb d'indice; voici mon code:

#Remarque: ce sont les noms des colonnes de ma matrice nommé listoccup
listNomAggreg[[1]] <- c("111","112","121","122","123","124","131","132","133","141","142","231","321","322","331","411","421","422","423","512")
listNomAggreg[[2]] <- c("312","324")
listNomAggreg[[3]] <- c("311","313")
listNomAggreg[[4]] <- c("211","221","222","242","243")

#de façon a enlever le 'X' que R rajoute pour tous les noms de colonne
names(listoccup) <- substring (names(listoccup),2,4)

#voici ma boucle qui permet de faire la somme en fonction des noms trouvé dans listNomAggreg[[...]]
for (i in seq (from=1, to=NbreClasse, by=1)) {
for (j in seq( length(listNomAggreg[[i]]))) {
tab1 <- listNomAggreg[[i]][[j]]
temp <- apply (listoccup[,names(tab1)], 1, sum)
listmatPI[[i]] <- matrix (temp, ((ligneEPI - ligneSPI)+1), ((colEPI - colSPI)+1))
}
}

vraisemblablement, quand j'affiche sous la console R le résultat de ma listmatPI, j'ai une matrice avec que des zéro à l'intérieur!!!
Ne comprend pas pourquoi?

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

Messagepar Sébastien Hamel » 19 Mai 2006, 08:47

J'ai réussi a faire otrement!!

Mais si toute fois tu avais le temps de réfléchir a ce pb, ta réponse m'interesse kan meme pour voire kommen tu l'auré abordé!!

Sinon tanpis, j'ai obtenue ce ke je voulé

Merci kan mem

Cordialement


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

Qui est en ligne

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

cron