398 votes

Convertit les colonnes data.frame de facteurs caractères

J'ai une trame de données. Appelons-le bob:

> head(bob)
                 phenotype                         exclusion
GSM399350 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399351 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399352 3- 4- 8- 25- 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399353 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399354 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-
GSM399355 3- 4- 8- 25+ 44+ 11b- 11c- 19- NK1.1- Gr1- TER119-

Je voudrais concaténer les lignes de la trame de données (c'est une autre question). Mais regardez:

> class(bob$phenotype)
[1] "factor"

Bobs'colonnes sont des facteurs. Ainsi, par exemple:

> as.character(head(bob))
[1] "c(3, 3, 3, 6, 6, 6)"       "c(3, 3, 3, 3, 3, 3)"      
[3] "c(29, 29, 29, 30, 30, 30)"

Je n'ai pas de commencer à comprendre cela, mais je suppose que ce sont des indices dans les niveaux des facteurs de colonnes (de la cour du roi caractacus) bob? Pas ce dont j'ai besoin.

Étrangement je peux aller dans les colonnes de l' bob à la main et ne

bob$phenotype <- as.character(bob$phenotype)

qui fonctionne très bien. Et, après quelques frappes, je peux obtenir un ensemble de données.image dont les colonnes sont des personnages plutôt que des facteurs. Donc ma question est: comment puis-je faire cela automatiquement? Comment puis-je convertir des données.image avec un facteur de colonnes dans un ensemble de données.cadre avec des colonnes de caractères sans avoir à sélectionner manuellement chaque colonne?

Question Bonus: pourquoi la méthode de travail?

389voto

Shane Points 40885

Juste après sur Matt et Dirk. Si vous souhaitez recréer votre trame de données existants sans modifier l’option global, vous pouvez le recréer avec une instruction d’appliquer :

Cela convertira toutes les variables de classe « caractère », si vous voulez convertir uniquement des facteurs, voir solution de Marek ci-dessous.

345voto

Marek Points 18000

Pour remplacer uniquement de facteurs :

43voto

Dirk Eddelbuettel Points 134700

L’option globale

stringsAsFactors : le paramètre par défaut pour les arguments de data.frame et read.table.

peut être quelque chose que vous voulez définir yo dans vos fichiers de démarrage (par exemple ~ /. Rprofile). Voir .

26voto

Kikapp Points 175

Je sais que cette réponse est un peu tardive, mais si vous comprenez la façon dont les facteurs sont stockées, vous pouvez éviter d'utiliser appliquer des fonctions à accomplir cela. Ce qui n'est pas à supposer que l'application des solutions ne fonctionnent pas bien.

Les facteurs sont structurés comme des indices numériques liée à une liste de "niveaux". Ceci peut être vu si vous convertissez un facteur numérique. Donc:

> fact <- as.factor(c("a","b","a","d")
> fact
[1] a b a d
Levels: a b d

> as.numeric(fact)
[1] 1 2 1 3

Le nombre retourné dans la dernière ligne correspondent aux niveaux du facteur.

> levels(fact)
[1] "a" "b" "d"

Notez que levels() () retourne un tableau de caractères. Vous pouvez utiliser ce fait pour facilement et de façon compacte convertir des facteurs de chaînes de caractères ou des nombres comme ceci:

> fact_character <- levels(fact)[as.numeric(fact)]
> fact_character
[1] "a" "b" "a" "d"

Cela fonctionne aussi pour les valeurs numériques, à condition que vous enveloppez de votre expression en as.numeric().

> num_fact <- factor(c(1,2,3,6,5,4))
> num_fact
[1] 1 2 3 6 5 4
Levels: 1 2 3 4 5 6
> num_num <- as.numeric(levels(num_fact)[as.numeric(num_fact)])
> num_num
[1] 1 2 3 6 5 4

22voto

scentoni Points 179

Si vous voulez une nouvelle trame de données où *chaque* facteur vector dans est converti en un vecteur de caractère, essayez ceci :

Si vous souhaitez convertir de nouveau, vous pouvez créer un vecteur de logique dont les colonnes sont des facteurs et qui permet d’appliquer de manière sélective facteur

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