web-dev-qa-db-fra.com

Comment changer le nom des niveaux de facteur?

ensemble d'entraînement

trainSample <- cbind(data[1:980,1], data[1:980,2]) cl <-
factor(c(data[1:980,3]))

ensemble de test

testSample <- data(data[981:1485,1], data[981:1485,2])
cl.test <- clknn

prédiction

k <- knn(trainSample, testSample, cl, k = 5)

sortie

< k

  [1] 2 2 1 1 1 1 2 1 2 1 1 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 1 2 2 1 1 2 2 2 2 1 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2
 [60] 2 2 2 2 1 2 2 2 2 1 2 2 1 2 2 2 1 1 2 1 2 2 1 1 1 2 1 2 2 2 1 2 2 2 2 2 1 2 1 2 2 2 2 2 2 2 2 1 2 2 2 2 1 2 2 2 2 2 2
[119] 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 1 2 2 2 2 1 2 1 1 1 1 2 2 2 2 2 2 2 2 1 2 1 2 2 2 2 2 2 1 2 2 1 2 1 2 2 2 2
[178] 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 1 1 1 1 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 1
[237] 2 2 2 2 2 1 2 2 1 2 2 1 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 2 2 1 2 2 1 2 2 2 2 1 2 1 2 2 2 2 1 1 2 1 2 2 2 2 1 2 2 2
[296] 2 2 2 1 2 1 2 1 1 1 2 1 2 2 1 1 2 2 1 2 1 2 2 1 2 2 2 1 2 2 2 2 2 1 2 2 2 1 2 2 2 1 2 2 2 2 2 2 2 1 2 1 1 2 2 2 1 1 2
[355] 1 2 1 2 1 2 1 2 2 2 2 2 2 1 1 1 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 2 2 2 2 2 1 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2
[414] 2 2 1 2 2 2 2 2 2 2 2 2 1 1 2 2 2 1 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
[473] 2 2 2 2 2 1 1 2 2 2 2 2 1 2 2 1 1 2 2 1 2 2 1 2 1 2 2 1 2 2 2 2 2
Levels: 1 2

Je veux "c" et "not-c" (comme dans mon data.csv d'origine), au lieu de 1 et 2 (je ne sais pas non plus quel nombre est censé représenter lequel)

Quelqu'un peut-il aider?

12
Beginner questions

Il est très facile de changer les niveaux de facteur et de ne pas se tromper sur lequel:

Exemples de données:

> a <- factor(rep(c(1,2,1),50))
> a
  [1] 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2
 [75] 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1
[149] 2 1
Levels: 1 2

#this will help later as a verification
#this counts the instances for 1 and 2
> table(a)
a
  1   2 
100  50 

Comme vous pouvez le voir ci-dessus, l'ordre des niveaux est 1 premier et 2 seconde. Lorsque vous modifiez les niveaux (ci-dessous), l'ordre reste le même:

#the assignment function levels can be used to change the levels
#the order will remain the same i.e. 'c' for '1' and 'not-c' for '2'
levels(a) <- c('c', 'not-c')

> a
  [1] c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c    
 [25] c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c    
 [49] c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c    
 [73] c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c    
 [97] c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c    
[121] c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c     c     not-c c    
[145] c     not-c c     c     not-c c    
Levels: c not-c

Et voici la vérification:

> table(a)
a
    c not-c 
  100    50 
24
LyzandeR

L'affectation souscrite fonctionne également. Par exemple, voici un facteur:

> a <- factor(sample(letters[1:5],100,replace=T))
> a
  [1] a d d d d a d d a b a b e a c d a c a a b e e d a e d e e a a c a a a b a
 [38] b b a a e b d b c a a a b e b c e d d b b c c a b a d c b c c d e b d e d
 [75] a a a b e e c b c b c c d d e e d a e e e b c e b e
Levels: a b c d e

Maintenant, donnons à ces niveaux de nouveaux noms:

> levels(a)[c(2,4)] <- c('y','z')
> a
  [1] a z z z z a z z a y a y e a c z a c a a y e e z a e z e e a a c a a a y a
 [38] y y a a e y z y c a a a y e y c e z z y y c c a y a z c y c c z e y z e z
 [75] a a a y e e c y c y c c z z e e z a e e e y c e y e
Levels: a y c z e
5
cbare

utilisez forcats package.

a <- factor(rep(c(1,2,1),50))

fct_collapse(a,c = c("1"),`not-c` = c("2"))
2
dondapati

Vous pouvez faire quelque chose comme ça:

x<-factor(c(1,1,2,3,1), labels=c("group1","group2","group3")) 
> x 
[1] group1 group1 group2 group3 group1 
Levels: group1 group2 group3

Ou comme ça:

train <- read.csv("train.csv", header=TRUE)[1:1000, ]
labels <- train[,1]
1
Chris