2010-02-26 7 views
9

Chaque fois que je dois recoder un ensemble de variables, j'ai la fonction de recodage SPSS à l'esprit. Je dois admettre que c'est assez simple. Il y a une fonction recode similaire dans le paquet car, et cela fait l'affaire, mais supposons que je veuille faire les choses avec factor.Recoder/redéfinir les données avec différents niveaux

J'ai data.frame avec plusieurs variables avec plage de valeurs de 1 à 7. Je veux des valeurs variables « reverse », remplaçant donc 1s avec 7s, 2 s avec 6s, 3 s avec 5 s etc. Je peux utiliser factor fonction:

# create dummy factor 
set.seed(100) 
x <- as.factor(round(runif(100,1,7))) 
y <- factor(x, levels = rev(levels(x))) 

Et si je cours:

> levels(x) 
[1] "1" "2" "3" "4" "5" "6" "7" 
> levels(y) 
[1] "7" "6" "5" "4" "3" "2" "1" 

problème commence quand je veux recoder des facteurs qui ne sont pas des niveaux égaux. Si un facteur, z, a des niveaux c("1", "3", "4", "6", "7"), y a-t-il une chance que je puisse "inverser" les niveaux alors 1 = 7, 2 = 6, 3 = 5 etc. en utilisant la fonction factor?

D'autres fonctions de recodage efficaces devraient suffire!

Répondre

7

Vous devez fournir l'argument levels pour tenir compte (comme Dirk a écrit):

set.seed(2342472) 
(x <- round(runif(10,1,7))) 
# [1] 7 5 5 3 1 2 5 3 3 2 
(xf <- as.factor(x)) 
# [1] 7 5 5 3 1 2 5 3 3 2 
# Levels: 1 2 3 5 7 
(yf <- factor(x,levels=7:1)) 
# [1] 7 5 5 3 1 2 5 3 3 2 
# Levels: 7 6 5 4 3 2 1 

vous pouvez le faire sur le facteur existant trop

(yxf <- factor(xf,levels=7:1)) 
# [1] 7 5 5 3 1 2 5 3 3 2 
#Levels: 7 6 5 4 3 2 1 

Comme vous voyez, les niveaux ont été étendus dans l'ordre du désir.

+0

Merci pour celui-ci! Il semble que je sois trop fatigué et que je manque l'évidence. La solution était si simple ... Merci encore une fois! – aL3xa

+0

+1 Merci! Cela a résolu un problème similaire pour moi. –

3

Oui, juste attribuons à levels:

R> set.seed(100) 
R> x <- as.factor(round(runif(100,1,7))) 
R> table(x) 
x 
1 2 3 4 5 6 7 
3 16 20 19 18 17 7 
R> levels(x) <- LETTERS[1:7] 
R> table(x) 
x 
A B C D E F G 
3 16 20 19 18 17 7 
R> 
+0

Il semble que je n'étais pas très concis avec ma question. Si j'ai des niveaux "incomplets", par ex. c ("2", "4", "5", "6") en les inversant je vais obtenir c ("6", "5", "4", "2"), et je ne veux pas pour faire ça. Je veux remplacer les valeurs/niveaux de sorte que 1 = 7, 2 = 6, 3 = 5, et vice versa. Est-ce possible avec la fonction facteur/niveau, ou dois-je utiliser car :: recode() ?? – aL3xa

2

Si vous remplissez les niveaux de facteur que vous êtes bon pour aller:

df <- data.frame(x=factor(c(2,4,5,6))) 
df$x <- factor(df$x, levels = 7:1) 
table(df$x) 

7 6 5 4 3 2 1 
0 1 1 1 0 1 0 
1

Dans ce cas, puisque vous avez des chiffres, pourquoi ne pas transformer simplement les chiffres à l'aide arithmétique modulaire?

par exemple

levels(x) <- as.character((6*as.numeric(levels(x)))%%7+1) 

Modifier le 6 et 7, selon le cas si l'on utilise des gammes plus larges.

+0

Que fait %%? – Farrel

+0

Opérateur de module (reste), similaire à% dans C/Java etc, bien que je crois que les valeurs négatives sont traitées différemment. – James

+0

Intéressant ... Je vais essayer! – aL3xa

Questions connexes