2010-02-26 11 views
9

Mỗi khi tôi phải mã hóa một số biến số, tôi có chức năng ghi nhớ SPSS. Tôi phải thừa nhận rằng nó khá đơn giản. Có một hàm recode tương tự trong gói car và nó thực hiện thủ thuật, nhưng hãy giả sử rằng tôi muốn hoàn thành công việc với factor.Các yếu tố khung dữ liệu/tái phát với các mức khác nhau

Tôi có data.frame với nhiều biến với phạm vi giá trị từ 1 đến 7. Tôi muốn "đảo ngược" giá trị biến, do đó thay thế 1s với 7s, 2s với 6s, 3s với 5s vv Tôi có thể sử dụng chức năng factor:

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

Và nếu tôi chạy:

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

vấn đề bắt đầu khi tôi muốn để recode yếu tố mà không có trình độ tương đương. Nếu một số yếu tố, z, có mức c("1", "3", "4", "6", "7"), có bất kỳ cơ hội nào mà tôi có thể "đảo ngược" các mức như vậy 1 = 7, 2 = 6, 3 = 5 vv bằng cách sử dụng hàm factor?

Các chức năng recode hiệu quả khác sẽ đủ!

Trả lời

7

Bạn phải cung cấp levels luận đến yếu tố (như Dirk viết):

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 

bạn có thể làm điều này trên yếu tố hiện quá

(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 

Khi bạn thấy các cấp đã được mở rộng theo thứ tự mong muốn.

+0

Cảm ơn bạn! Có vẻ như tôi quá mệt mỏi và mất tích rõ ràng. Giải pháp rất đơn giản ... Cảm ơn một lần nữa! – aL3xa

+0

+1 Cảm ơn! Điều này giải quyết một vấn đề tương tự cho tôi. –

3

Vâng, chỉ gán cho 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

Dường như tôi không hoàn toàn súc tích với câu hỏi của mình. Nếu tôi có các cấp "không đầy đủ", ví dụ: c ("2", "4", "5", "6") bằng cách đảo ngược chúng, tôi sẽ nhận được c ("6", "5", "4", "2") và tôi không muốn Để làm việc đó. Tôi muốn thay thế giá trị/mức để 1 = 7, 2 = 6, 3 = 5 và ngược lại. Có phải là posible với yếu tố/chức năng cấp, hoặc tôi phải sử dụng xe hơi :: recode() ?? – aL3xa

2

Nếu bạn hoàn thành cấp độ yếu tố bạn tốt để đi:

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

Trong trường hợp này, kể từ khi bạn có con số, tại sao không chỉ chuyển đổi những con số sử dụng số học modula?

ví dụ

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

Sửa đổi 6 và 7 như thích hợp nếu sử dụng dãy lớn hơn.

+0

%% làm gì? – Farrel

+0

Toán tử mô-đun (số dư), tương tự như% trong C/Java, v.v. mặc dù tôi tin rằng các giá trị âm được xử lý khác nhau. – James

+0

Thú vị ... Tôi sẽ thử! – aL3xa