2012-08-15 4 views
0

Existe-t-il une fonction R native qui prendra un vecteur d'entrée et renverra la matrice binaire correspondante où la matrice a le même nombre de colonnes que des valeurs uniques dans le vecteur d'entrée?Convertir un vecteur en matrice logique

Par exemple, étant donné x <- 1:3, je veux retourner la matrice suivante:

 [,1] [,2] [,3] 
[1,] 1 0 0 
[2,] 0 1 0 
[3,] 0 0 1 

Les fonctions contrasts se rapproche, mais je ne peux pas sembler se déplacer dans les colonnes n-1 retourné:

> contrasts(as.factor(x)) 
    2 3 
1 0 0 
2 1 0 
3 0 1 
+0

Pouvez-vous préciser si le facteur ne contiendra jamais qu'une seule observation de chaque niveau? Ou peut-il y avoir plusieurs observations par niveau? –

Répondre

5

model.matrix() pourrait aider, mais vous devez supprimer l'interception:

> model.matrix(~ factor(1:3) - 1) 
    factor(1:3)1 factor(1:3)2 factor(1:3)3 
1   1   0   0 
2   0   1   0 
3   0   0   1 
attr(,"assign") 
[1] 1 1 1 
attr(,"contrasts") 
attr(,"contrasts")$`factor(1:3)` 
[1] "contr.treatment" 

Quelque chose un peu plus complexe:

> set.seed(1) 
> fac <- factor(sample(1:3, 10, replace = TRUE)) 
> model.matrix(~ fac - 1) 
    fac1 fac2 fac3 
1  1 0 0 
2  0 1 0 
3  0 1 0 
4  0 0 1 
5  1 0 0 
6  0 0 1 
7  0 0 1 
8  0 1 0 
9  0 1 0 
10 1 0 0 
attr(,"assign") 
[1] 1 1 1 
attr(,"contrasts") 
attr(,"contrasts")$fac 
[1] "contr.treatment" 
+0

Beaucoup plus clair +1 –

4

En fait, contrasts est ce que vous voulez.

contrasts(as.factor(1:3), contrasts=FALSE) 

    1 2 3 
1 1 0 0 
2 0 1 0 
3 0 0 1 
+0

BAH - J'ai totalement échoué à lire la documentation ... merci monsieur. – Chase

+1

@Chase Si ** que ** * est * ce que vous voulez, qu'est-ce qui ne va pas avec 'diag (3)' ??? Notez que pour le 'fac' plus complexe dans ma réponse,' contrastes (fac, contrasts = FALSE) 'ne donne pas le même résultat que' model.matrix() '. Peut-être ai-je mal compris ce que vous vouliez, mais si je l'ai fait, 'diag()' est-il suffisant? –

+0

@GavinSimpson - bonne intuition, je suis partout ce matin. Votre second exemple est plus représentatif de mon cas d'utilisation réel. Doit consommer du café et/ou dormir. Merci encore. – Chase