2010-02-26 1 views
9

Jedes Mal, wenn ich einige Variablen neu codieren muss, habe ich SPSS recode-Funktion im Hinterkopf. Ich muss zugeben, dass es ziemlich einfach ist. Es gibt eine ähnliche recode Funktion in car Paket, und es macht den Trick, aber lassen Sie uns voraussetzen, dass ich Dinge mit factor erledigen will.Recode/relevel data.frame Faktoren mit verschiedenen Ebenen

Ich habe data.frame mit mehreren Variablen mit Wertebereich von 1 bis 7. Ich mag Variablenwerte „rückwärts“, also 1s mit 7s 2s mit 6s, 3s mit 5s usw. ersetzen kann ich factor Funktion nutzen:

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

Und wenn ich laufen:

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

Problem beginnt, wenn ich Faktoren rekodieren wollen, die nicht gleich Ebenen haben. Wenn ein Faktor, z, Ebenen hat c("1", "3", "4", "6", "7"), gibt es eine Chance, dass ich Ebenen "1", also 1 = 7, 2 = 6, 3 = 5 usw. "umkehren" kann, indem Sie factor Funktion verwenden?

Andere effiziente Recode-Funktionen sollten ausreichen!

Antwort

7

Sie levels Argument liefern muss Faktor (als Dirk schrieb):

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 

Sie dies auch auf bestehende Faktor tun könnte

(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 

Wie Sie sehen, Ebenen wurden in Wunsch Reihenfolge erweitert.

+0

Danke für diesen! Es scheint, dass ich einfach zu müde bin und das Offensichtliche vermisse. Lösung war so einfach ... Danke nochmal! – aL3xa

+0

+1 Danke! Dies löste ein ähnliches Problem für mich. –

3

Ja, weisen nur 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

Es scheint, dass ich mit meiner Frage nicht ganz prägnant war. Wenn ich "unvollständige" Niveaus habe, z.B. c ("2", "4", "5", "6") indem ich sie umkehre, bekomme ich c ("6", "5", "4", "2"), und ich will nicht das zu tun. Ich möchte Werte/Ebenen so ersetzen, dass 1 = 7, 2 = 6, 3 = 5 und umgekehrt. Ist das möglich mit factor/level function, oder muss ich car :: recode() ?? – aL3xa

2

Wenn Sie die Faktorstufen vervollständigen Sie gut sind zu gehen:

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 diesem Fall, da Sie Zahlen haben, warum nicht nur die Zahlen verwandeln modulare Arithmetik?

zB

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

den 6 und 7 entsprechend ändern, wenn größere Bereiche verwenden.

+0

Was macht %%? – Farrel

+0

Modulus-Operator (Rest), ähnlich wie% in C/Java usw., obwohl ich glaube, dass negative Werte unterschiedlich behandelt werden. – James

+0

Interessant ... Ich werde es versuchen! – aL3xa