web-dev-qa-db-fra.com

Comment convertir certaines colonnes d'un bloc de données en facteurs?

Duplicate possible:
identifiant ou codant des facteurs uniques en utilisant R

J'ai des problèmes avec R.

J'ai un ensemble de données semblable au suivant, mais beaucoup plus long.

A B Pulse
1 2 23
2 2 24
2 2 12
2 3 25
1 1 65
1 3 45

Fondamentalement, les 2 premières colonnes sont codées. A a 1, 2 qui représentent 2 poids différents. B a 1, 2, 3 qui représentent 3 fois différentes.

S'agissant de valeurs numériques codées, R les traitera comme des variables numériques. Je dois utiliser la fonction factor pour convertir ces variables en facteurs.

Aidez-moi?

38
math11

Voici un exemple:

#Create a data frame
> d<- data.frame(a=1:3, b=2:4)
> d
  a b
1 1 2
2 2 3
3 3 4

#currently, there are no levels in the `a` column, since it's numeric as you point out.
> levels(d$a)
NULL

#Convert that column to a factor
> d$a <- factor(d$a)
> d
  a b
1 1 2
2 2 3
3 3 4

#Now it has levels.
> levels(d$a)
[1] "1" "2" "3"

Vous pouvez également gérer cela lors de la lecture de vos données. Voir les paramètres colClasses et stringsAsFactors dans par exemple. readCSV().

Notez que, en calcul, la factorisation de telles colonnes ne vous aidera pas beaucoup et peut en fait ralentir votre programme (même s’il est négligeable). L'utilisation d'un facteur nécessite que toutes les valeurs soient mappées sur des ID en coulisse. Ainsi, toute impression de votre data.frame nécessite une recherche à ces niveaux - une étape supplémentaire qui prend du temps.

Les facteurs sont parfaits pour stocker des chaînes que vous ne souhaitez pas stocker à plusieurs reprises, mais que vous référeriez plutôt par leur ID. Envisagez de stocker un nom plus convivial dans ces colonnes pour tirer pleinement parti des facteurs.

49
Jeff Allen

Étant donné l'échantillon suivant

myData <- data.frame(A=rep(1:2, 3), B=rep(1:3, 2), Pulse=20:25)  

ensuite

myData$A <-as.factor(myData$A)
myData$B <-as.factor(myData$B)

ou vous pouvez tout à fait sélectionner vos colonnes et les envelopper bien:

# select columns
cols <- c("A", "B")
myData[,cols] <- data.frame(apply(myData[cols], 2, as.factor))

levels(myData$A) <- c("long", "short")
levels(myData$B) <- c("1kg", "2kg", "3kg")

Obtenir

> myData
      A   B Pulse
1  long 1kg    20
2 short 2kg    21
3  long 3kg    22
4 short 1kg    23
5  long 2kg    24
6 short 3kg    25
26
Ricardo Saporta