112 votes

Développer automatiquement un facteur R en une collection de variables indicatrices 1/0 pour chaque niveau de facteur

J'ai un R bloc de données contenant un facteur que je veux "développer" de sorte que, pour chaque niveau du facteur, il est associé à une colonne dans un nouveau bloc de données, qui contient une 1/0 indicateur. E. g., supposons que j'ai:

df.original <-data.frame(eggs = c("foo", "foo", "bar", "bar"), ham = c(1,2,3,4))

Je veux:

df.desired  <- data.frame(foo = c(1,1,0,0), bar=(0,0,1,1), ham=c(1,2,3,4))

Parce que pour certaines analyses pour lequel vous avez besoin d'avoir un complètement numérique trame de données (par exemple, l'analyse en composantes principales), j'ai pensé que cette fonctionnalité sera intégrée. Écrire une fonction pour faire cela ne devrait pas être trop dur, mais je peux prévoir certains problèmes relatifs aux noms de colonne et si quelque chose existe déjà, je préfère l'utiliser.

136voto

Greg Snow Points 22040

Utilisez la fonction model.matrix.

 model.matrix( ~ Species - 1, data=iris )
 

17voto

juba Points 15701

Si votre bloc de données est uniquement faite de facteurs (ou que vous travaillez sur un sous - ensemble de variables qui sont tous les facteurs), vous pouvez également utiliser le acm.disjonctif fonction de la ade4 forfait:

 R> library(ade4)
R> df <-data.frame(eggs = c("foo", "foo", "bar", "bar"), ham = c("red","blue","green","red"))
R> acm.disjonctif(df)
  eggs.bar eggs.foo ham.blue ham.green ham.red
1        0        1        0         0       1
2        0        1        1         0       0
3        1        0        0         1       0
4        1        0        0         0       1
 

Pas exactement le cas que vous décrivez, mais cela peut être utile aussi ...

9voto

Prasad Chalasani Points 9020

Un moyen rapide en utilisant le package reshape2 :

 require(reshape2)

> dcast(df.original, ham ~ eggs, length)

Using ham as value column: use value_var to override.
  ham bar foo
1   1   0   1
2   2   0   1
3   3   1   0
4   4   1   0
 

Notez que cela produit précisément les noms de colonne souhaités.

7voto

kohske Points 30437

variable factice est probablement similaire à ce que vous voulez. Ensuite, model.matrix est utile:

 > with(df.original, data.frame(model.matrix(~eggs+0), ham))
  eggsbar eggsfoo ham
1       0       1   1
2       0       1   2
3       1       0   3
4       1       0   4
 

4voto

Tyler Rinker Points 27607

Je viens de tomber sur ce vieux fil et je pensais ajouter une fonction qui utilise ade4 pour prendre une trame de données composée de facteurs et / ou de données numériques et renvoie une trame de données avec des facteurs en tant que codes factices.

 dummy <- function(df) {  

    NUM <- function(dataframe)dataframe[,sapply(dataframe,is.numeric)]
    FAC <- function(dataframe)dataframe[,sapply(dataframe,is.factor)]

    require(ade4)
    if (is.null(ncol(NUM(df)))) {
        DF <- data.frame(NUM(df), acm.disjonctif(FAC(df)))
        names(DF)[1] <- colnames(df)[which(sapply(df, is.numeric))]
    } else {
        DF <- data.frame(NUM(df), acm.disjonctif(FAC(df)))
    }
    return(DF)
} 
 

Essayons.

 df <-data.frame(eggs = c("foo", "foo", "bar", "bar"), 
            ham = c("red","blue","green","red"), x=rnorm(4))     
dummy(df)

df2 <-data.frame(eggs = c("foo", "foo", "bar", "bar"), 
            ham = c("red","blue","green","red"))  
dummy(df2)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X