2010-05-03 5 views
3

Quelqu'un peut-il expliquer pourquoi niveaux() montre trois niveaux de facteur, alors que vous pouvez voir que le vecteur n'en a que deux?comportement inattendu lors de l'extraction des niveaux de facteur

> str(walk.df) 
'data.frame': 10 obs. of 4 variables: 
$ walker : Factor w/ 3 levels "1","2","3": 1 1 1 1 1 2 2 2 2 2 

> walk.df$walker 
[1] 1 1 1 1 1 2 2 2 2 2 
Levels: 1 2 3 

Je voudrais extraire un vecteur de niveaux, et je pensais que cela était la bonne façon, mais comme vous pouvez le voir, trois se faufile là-dedans qui salit ma fonction.

> as.numeric(levels(walk.df$walker)) 
[1] 1 2 3 
+0

'... montre trois variables' peut-être que vous vouliez dire' values' ou 'levels'? – aL3xa

+0

Vous avez raison, je voulais dire les niveaux. –

+1

Rétrospectivement, on peut maintenant utiliser 'droplevels()' sur un objet sous-estimé et éviter d'avoir ce problème complètement. –

Répondre

9

probablement walk.df est un sous-ensemble de la variable facteur à 3 niveaux. dire

a<-factor(1:3) 
b<-a[1:2] 

alors b a 3 niveaux.

Un moyen facile de laisser tomber le niveau supplémentaire est:

b<-a[1:2, drop=T] 

ou si vous ne pouvez pas accéder à la variable d'origine,

b<-factor(b) 
+0

Vous avez raison, c'est un sous-ensemble. J'ai haché l'objet si fort que j'ai oublié que j'échantais de l'objet brut - qui a trois niveaux. –

0

Vous pouvez affecter plusieurs niveaux de facteur à un facteur qui contient deux niveaux:

> set.seed(1234) 
> x <- round(runif(10, 1, 2)) 
> x 
    [1] 1 2 2 2 2 2 1 1 2 2 
> y <- factor(x) 
> levels(y) 
[1] "1" "2" 
> levels(y) <- c("1", "2", "3") 
> y 
    [1] 1 2 2 2 2 2 1 1 2 2 
Levels: 1 2 3 

ou même pas à tous les niveaux:

> p <- NA 
> q <- factor(p) 
> levels(q) 
character(0) 
> levels(q) <- c("1", "2", "3") 
> q 
[1] <NA> 
Levels: 1 2 3 
+0

Ce que je voulais vraiment, c'était extraire les niveaux qui apparaissent dans le sous-ensemble. J'ai résolu ceci avec list.of.walkers <- sort (unique (label walk.df $)). –

Questions connexes