2010-02-26 14 views
9

Ogni volta che devo ricodificare un gruppo di variabili, ho in mente la funzione di recitazione SPSS. Devo ammettere che è piuttosto semplice. C'è una funzione simile recode nel pacchetto car, e fa il trucco, ma supponiamo che voglio fare le cose con factor.Recode/relevel data.frame fattori con livelli diversi

devo data.frame con diverse variabili con campo di valori da 1 a 7. voglio "reverse" valori variabili, quindi sostituendo 1s con 7s, 2s con 6s, 3s con 5s ecc I possono utilizzare factor funzione:

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

E se corro:

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

problema inizia quando voglio ricodificare i fattori che non hanno livelli uguali. Se qualche fattore, z, ha i livelli c("1", "3", "4", "6", "7"), è possibile che io possa "invertire" i livelli in modo che 1 = 7, 2 = 6, 3 = 5 ecc. Utilizzando la funzione factor?

Altre funzioni di ricodifica efficienti dovrebbero essere sufficienti!

risposta

7

È necessario fornire levels argomento al fattore (come ha scritto 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 

si potrebbe fare questo il fattore esistente troppo

(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 

Come vedi i livelli sono stati estesi nell'ordine desiderato.

+0

Grazie per questo! Sembra che io sia solo troppo stanco e mi manca l'ovvio. La soluzione è stata così semplice ... Grazie ancora! – aL3xa

+0

+1 Grazie! Questo ha risolto un problema simile per me. –

3

Sì, basta assegnare 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

Sembra che non fossi abbastanza conciso con la mia domanda. Se ho livelli "incompleti", ad es. c ("2", "4", "5", "6") invertendoli otterrò c ("6", "5", "4", "2"), e non voglio fare quello. Voglio sostituire valori/livelli in modo che 1 = 7, 2 = 6, 3 = 5 e viceversa. È possibile con la funzione factor/level o devo usare car :: recode() ?? – aL3xa

2

Se si completano i livelli di fattore si sta bene ad andare:

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

In questo caso, dal momento che si dispone di numeri, perché non solo trasformare i numeri usando aritmetica modulare?

es

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

Modificare il 6 e 7 come appropriato se utilizza intervalli più grandi.

+0

Che cosa fa %%? – Farrel

+0

Operatore modulo (resto), simile a% in C/Java ecc., Anche se ritengo che i valori negativi siano trattati in modo diverso. – James

+0

Interessante ... ci proverò! – aL3xa