2010-02-26 13 views
9

Za każdym razem, gdy muszę przekodować jakiś zestaw zmiennych, mam na myśli funkcję recoding SPSS. Muszę przyznać, że jest to dość proste. Istnieje podobna funkcja recode w pakiecie car i działa ona zręcznie, ale załóżmy, że chcę załatwić sprawy przy pomocy factor.Czynniki data.frame recode/relevel na różnych poziomach

mam data.frame kilka zmiennych wartości z zakresu od 1 do 7. chce „reverse” wartości zmiennych, a tym samym zastąpienia 1s z 7S, 2S z 6S, 3S z 5S itp można wykorzystać factor funkcję:

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

A jeśli biegnę:

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

problem zaczyna się gdy chcę przekodować czynniki, które nie mają równych poziomach. Jeśli jakiś czynnik, z, ma poziomy c("1", "3", "4", "6", "7"), czy jest jakaś szansa, że ​​mogę "odwrócić" poziomy tak 1 = 7, 2 = 6, 3 = 5 itd. Używając funkcji factor?

Inne skuteczne funkcje recode powinny wystarczyć!

Odpowiedz

7

Musisz podać levels argument Factor (jak Dirk napisał):

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 

można zrobić to na istniejącej czynnik zbyt

(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 

Jak widać poziomy zostały rozszerzone w kolejności pożądanej.

+0

Dzięki za to! Wygląda na to, że jestem po prostu zbyt zmęczony i brakuje mi tego, co oczywiste. Rozwiązanie było tak proste ... Jeszcze raz dziękuję! – aL3xa

+0

+1 Dzięki! To rozwiązało dla mnie podobny problem. –

3

Tak, wystarczy przypisać do 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

Wygląda na to, że nie byłem dość zwięzły w stosunku do mojego pytania. Jeśli mam poziomy "niekompletne", np. c ("2", "4", "5", "6") odwracając je otrzymam c ("6", "5", "4", "2") i nie chcę aby to zrobić. Chcę zastąpić wartości/poziomy tak, aby 1 = 7, 2 = 6, 3 = 5 i na odwrót. Czy to jest posible z funkcją factor/level, czy też muszę użyć car :: recode() ?? – aL3xa

2

Jeśli ukończyć poziom czynnika jesteś dobry, aby przejść:

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

W tym przypadku, ponieważ masz numery, dlaczego nie wystarczy przekształcić liczby osób korzystających z modułową arytmetyki?

np

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

Modyfikacja odpowiednio 6 i 7, w przypadku korzystania z większych zakresów.

+0

Co robi %%? – Farrel

+0

Operator modulus (reszta), podobny do% w C/Java itp., Chociaż uważam, że wartości ujemne są traktowane inaczej. – James

+0

Interesujące ... Spróbuję! – aL3xa

Powiązane problemy