Sélection des colonnes d'une matrice

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

Sélection des colonnes d'une matrice

Messagepar Sébastien Hamel » 20 Juil 2006, 10:01

voici l'erreur que l'on me retourne pour la boucle suivante:

for (i in seq (from=1, to=NbreClasse, by=1)) {
temp <- apply (listoccup[,selec1==names(listNomClasse)[[i]]], 1, sum)
}

Erreur dans apply(listoccup[, selec1 == names(listNomClasse)[[i]]], 1, sum) :
dim(X) doit avoir un longueur positive


& voici la description de tous mes paramètres intervenants dans la boucle:
dim (listoccup)
[1] 17850 31
length(listoccup)
[1] 31
length(selec1)
[1] 31
length(listNomClasse)
[1] 6
NbreClasse
[1] 6


Qq'un voit-il ou est l'erreur?

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

Messagepar Renaud Lancelot » 20 Juil 2006, 21:26

J'ai renommé le titre du message: merci d'utiliser des titres précis et en relation avec l'opération qui vous pose problème...

Le code

Code : Tout sélectionner

selec1 == names(listNomClasse)[[i]]]


me paraît doûteux. L'exécuter à part pour voir ce qu'il retourne: en principe un vecteur logique de longueur

Code : Tout sélectionner

max(length(selec1), length(names(listNomClasse)))

soit 31.

Un pb potentiel est que les deux vecteurs selec1 et names(listNomClasse) ont des longueurs différentes. La régle du recyclage s'applique alors:

Code : Tout sélectionner

> v1 <- paste("a", 1:6, sep = "")
> v2 <- paste("a", 1:31, sep = "")
>
> v1
[1] "a1" "a2" "a3" "a4" "a5" "a6"
> v2
 [1] "a1"  "a2"  "a3"  "a4"  "a5"  "a6"  "a7"  "a8"  "a9"  "a10" "a11" "a12" "a13" "a14" "a15" "a16" "a17" "a18" "a19" "a20" "a21" "a22" "a23" "a24" "a25"
[26] "a26" "a27" "a28" "a29" "a30" "a31"
> v1 == v2
 [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[26] FALSE FALSE FALSE FALSE FALSE FALSE
Warning message:
la longueur de l'objet le plus long
        n'est pas un multiple de la longueur de l'objet le plus court in: v1 == v2


Sans connaître l'objectif recherché, on ne peut que supposer (dommage et à éviter quand on pose des questions sur un forum). Il est possible que le code doûteux soit avantageusement remplacé par

Code : Tout sélectionner

is.element(names(listNomClasse)[[i]]], selec1)


Appliqué à l'exemple ci-dessus, cela donne:

Code : Tout sélectionner

> is.element(v2, v1)
 [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[26] FALSE FALSE FALSE FALSE FALSE FALSE


Quant au message d'erreur, il est probablement dû au cas où le vecteur logique contient un seul TRUE, qui aboutit à la selection d'une matrice à 1 colonne, par défaut automatiquement transformée en vecteur. Un vecteur n'ayant pas d'attribut dimension, la fonction apply est plantée:

Code : Tout sélectionner

> mat <- matrix(1:4, ncol = 2)
> mat
     [,1] [,2]
[1,]    1    3
[2,]    2    4
> apply(mat[, c(TRUE, FALSE)], 1, sum)
Erreur dans apply(mat[, c(TRUE, FALSE)], 1, sum) :
        dim(X) doit avoir un longueur positive


Pour éviter cela, il suffit d'ajouter l'argument drop = FALSE dans la sélection:

Code : Tout sélectionner

> apply(mat[, c(TRUE, FALSE), drop = FALSE], 1, sum)
[1] 1 2


soit dans votre cas:

Code : Tout sélectionner

apply (listoccup[ , selec1==names(listNomClasse)[[i]], drop = FALSE], 1, sum)

Renaud


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

Qui est en ligne

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