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?
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.
É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