2010-02-26 12 views
9

Bazı değişkenler listesini yeniden yazmam gerektiğinde, SPSS recode işlevini göz önünde bulundururum. Oldukça basit olduğunu itiraf etmeliyim. car paketinde benzer bir recode işlevi var, ve bu hile yok, ama factor ile işlerin bitmesini istediğimi varsayalım.Farklı düzeylerde data.frame faktörlerini yeniden kodlayın/yeniden konumlandırın

I dolayısıyla 6s, 7s ile 2s 1s değiştirilmesi, bir değişken değerleri "geri" istiyor 1 ile 7 değer aralığı çeşitli değişkenler data.frame sahip vb 5s 3s I factor işlevi kullanabilir:

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

koşuyorum Ve eğer: Ben eşit düzeylerde yok faktörleri yeniden kodlanmasına istediğinizde

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

sorun başlar. Bazı faktörler, z, c("1", "3", "4", "6", "7") seviyelerine sahipse, factor işlevini kullanarak 1 = 7, 2 = 6, 3 = 5 vb. Seviyeyi "tersine çevirme" şansım var mıdır?

Diğer verimli düzeltme işlevleri yeterli olmalıdır!

cevap

7

Sen faktör levels argüman sağlaması gerekir:

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 

varolan faktör de

(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 
bu yapabileceğini

Seviyelerin arzu düzeyine göre genişletildiğini gördünüz.

+0

Bunun için teşekkürler! Görünüşe göre çok yorgunum ve açık olanı kaçırdım. Çözüm çok basitti ... Bir kez daha teşekkürler! – aL3xa

+0

+1 Teşekkürler! Bu benim için benzer bir problemi çözdü. –

3

Evet, sadece levels atamak: (Dirk yazdığı gibi)

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

Bu, benim sorduğum soruya tam olarak benzemediğim gözüküyor. "Tamamlanmamış" seviyelerim varsa, ör. c ("2", "4", "5", "6") onları ters çevirerek c ("6", "5", "4", "2") alırım ve istemiyorum bunu yapmak için. Değerleri/seviyeleri değiştirmek istiyorum, böylece 1 = 7, 2 = 6, 3 = 5 ve tersi. Bu faktör/seviye fonksiyonu ile mümkün mü yoksa ben araba :: recode() kullanmak zorunda mıyım? – aL3xa

2

Eğer gitmek iyi faktör seviyelerini tamamlarsanız: Bu durumda

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

, sayıları beri, neden sadece modüler aritmetik kullanarak numaralar dönüştürmek değil? Daha büyük aralıkları kullanılarak halinde

örneğin

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

6 ve 7, uygun şekilde değiştirmek.

+0

%% ne yapıyor? – Farrel

+0

Negatif değerlerin farklı şekilde ele alındığına inanmamıza rağmen, Modül operatörü (kalan),% C/Java vb. – James

+0

İlginç ... Bir deneyeceğim! – aL3xa

İlgili konular