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
me paraît doûteux. L'exécuter à part pour voir ce qu'il retourne: en principe un vecteur logique de longueur
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
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:
soit dans votre cas:
Code : Tout sélectionner
apply (listoccup[ , selec1==names(listNomClasse)[[i]], drop = FALSE], 1, sum)
Renaud