J'ai une trame de données R contenant un facteur que je veux "développer" de sorte que pour chaque niveau de facteur, il y ait une colonne associée dans une nouvelle trame de données, qui contient un indicateur 1/0. Par exemple, supposons que j'ai:
df.original <-data.frame(eggs = c("foo", "foo", "bar", "bar"), ham = c(1,2,3,4))
Je voudrais:
df.desired <- data.frame(foo = c(1,1,0,0), bar=c(0,0,1,1), ham=c(1,2,3,4))
Parce que pour certaines analyses pour lesquelles vous avez besoin d'une base de données entièrement numérique (par exemple, l'analyse des composants principaux), j'ai pensé que cette fonctionnalité pourrait être intégrée. Ecrire une fonction pour faire cela ne devrait pas être trop difficile, mais je peux en prévoir défis liés aux noms de colonnes et si quelque chose existe déjà, je préfère l'utiliser.
cast
pour moi.?formula
ainsi que?model.matrix
, mais ce n'était pas clair (pourrait simplement être mon manque de connaissances en algèbre matricielle et en formulation de modèles). Après avoir creusé davantage, j'ai pu comprendre que le -1 spécifie simplement de ne pas inclure la colonne "intercepter". Si vous omettez le -1, vous verrez une colonne d'interception de 1 dans la sortie avec une colonne binaire laissée de côté. Vous pouvez voir quelles valeurs la colonne omise sont des 1 en fonction des lignes où les valeurs des autres colonnes sont des 0. La documentation semble cryptique - existe-t-il une autre bonne ressource?model.matrix(~., data=iris)[,-1]
naresid
pour remettre les valeurs manquantes après utilisationna.exclude
. Un exemple rapide:tmp <- data.frame(x=factor(c('a','b','c',NA,'a'))); tmp2 <- na.exclude(tmp); tmp3 <- model.matrix( ~x-1, tmp2); tmp4 <- naresid(attr(tmp2,'na.action'), tmp3)
Si votre bloc de données est uniquement composé de facteurs (ou que vous travaillez sur un sous-ensemble de variables qui sont tous des facteurs), vous pouvez également utiliser la
acm.disjonctif
fonction duade4
package:Ce n'est pas exactement le cas que vous décrivez, mais cela peut aussi être utile ...
la source
Un moyen rapide d'utiliser le
reshape2
package:Notez que cela produit précisément les noms de colonne souhaités.
la source
ham
un identifiant de ligne unique. Si ceham
n'est pas un identifiant unique, il faut utiliser un autre identifiant unique (ou en créer un factice) et l'utiliser à la place deham
. La conversion d'une étiquette catégorielle en indicateur binaire n'aurait de sens que pour les identifiants uniques.probablement la variable factice est similaire à ce que vous voulez. Ensuite, model.matrix est utile:
la source
Une entrée tardive
class.ind
dunnet
packagela source
Je viens de tomber sur ce vieux fil et j'ai pensé 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 sous forme de codes factices.
Essayons.
la source
Voici une manière plus claire de le faire. J'utilise model.matrix pour créer les variables booléennes factices, puis les fusionner dans le dataframe d'origine.
la source
J'avais besoin d'une fonction pour «exploser» les facteurs qui soit un peu plus flexible, et j'en ai créé une basée sur la fonction acm.disjonctif du paquet ade4. Cela vous permet de choisir les valeurs éclatées, qui sont 0 et 1 dans acm.disjonctif. Cela n'explose que les facteurs qui ont «peu» de niveaux. Les colonnes numériques sont conservées.
la source