2017-01-20 4 views
1

J'ai une trame de données contenant, entre autres, deux colonnes faisant référence à la même chose. L'un est un identifiant numérique pour l'autre, qui est analysé comme un facteur.Modification de l'ordre des niveaux de facteur en fonction de la recherche dans une autre colonne

df = data.frame(
    "id" = c(5, 3, 1, 2, 4, 5), 
    "val" = factor(c("a", "b", "c", "d", "e", "a")), 
    "someColumn" = c(13, 38, 91, 83, 19) 
) 

Il existe des doublons dans ces niveaux de facteur puisqu'il existe d'autres colonnes supplémentaires. Maintenant, les niveaux de facteur sont classés par ordre alphabétique, peu importe dans quel ordre ils apparaissent dans la base de données.

Voici le problème: Je veux commander les niveaux du facteur en fonction de leur ID. De cette façon, il devient plus facile de travailler avec, en particulier dans les parcelles. Je ne veux pas changer les étiquettes. Je ferais bien de changer les niveaux à l'identification réelle, mais je ne pense pas que ce soit nécessaire.

Dans d'autres exemples que je trouvais, la suggestion était de faire quelque chose comme ceci:

factor(df$val, levels = df$val[order(df$id)]) 

Cependant, cela ne fonctionne pas dans mon cas, car il y a des doublons:

Warning message: 
In `levels<-`(`*tmp*`, value = if (nl == nL) as.character(labels) else paste0(labels, : 
    duplicated levels in factors are deprecated 

Je ne Je ne veux pas supprimer les lignes dans mes données d'origine, car je ne veux pas jeter les données ou changer son ordre, et continuer à travailler avec les données. Puis-je me débarrasser de l'avertissement et des niveaux dupliqués d'une autre manière? Ou devrais-je utiliser une autre approche entièrement?

Répondre

3

Essayez ceci:

factor(df$val, levels = unique(df$val[order(df$id)]))