2010-02-26 25 views
9

Cada vez que tengo que recodificar un conjunto de variables, tengo la función de recodificación de SPSS en mente. Debo admitir que es bastante sencillo. Hay una función similar recode en el paquete car, y lo hace, pero supongamos que quiero hacer cosas con factor.Recode/relevel data.frame factores con diferentes niveles

I tienen data.frame con varias variables con rango de valores de 1 a 7. quiero "inverso" valores de las variables, por lo tanto, la sustitución de 1s con 7s, 2s con 6s, 3S con 5s etc. I pueden utilizar factor función:

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

Y si me quedo:

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

problema comienza cuando quiero volver a codificar factores que no tienen niveles iguales. Si algún factor, z, tiene los niveles c("1", "3", "4", "6", "7"), ¿hay alguna posibilidad de que pueda "revertir" los niveles de modo que 1 = 7, 2 = 6, 3 = 5 etc. utilizando la función factor?

¡Otras funciones de recodificación eficientes deberían ser suficientes!

Respuesta

7

Debe proporcionar levels argumento al factor (como escribió Dirk):

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 

usted puede hacer esto en el factor existente demasiado

(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 

Como ve, los niveles se ampliaron en el orden deseado.

+0

¡Gracias por este! Parece que estoy demasiado cansado y me falta lo obvio. La solución fue tan simple ... ¡Gracias una vez más! – aL3xa

+0

+1 ¡Gracias! Esto resolvió un problema similar para mí. –

3

Sí, simplemente asignar a 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

Parece que no fui muy conciso con mi pregunta. Si tengo niveles "incompletos", p. c ("2", "4", "5", "6") invirtiéndolos obtendré c ("6", "5", "4", "2"), y no quiero Para hacer eso. Quiero reemplazar valores/niveles para que 1 = 7, 2 = 6, 3 = 5 y viceversa. ¿Es posible con la función factor/nivel, o tengo que usar auto :: recode() ?? – aL3xa

2

Si completa los niveles de los factores que está bueno para ir:

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

En este caso, ya que tiene los números, ¿por qué no transformar los números utilizando la aritmética modular?

por ejemplo

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

Modificar el 6 y 7 según sea apropiado si se utiliza rangos más grandes.

+0

¿Qué hace %%? – Farrel

+0

Operador de módulo (resto), similar al% en C/Java, etc., aunque creo que los valores negativos se tratan de manera diferente. – James

+0

Interesante ... ¡Lo probaré! – aL3xa

Cuestiones relacionadas