2012-12-16 46 views
12

Tôi muốn chuyển đổi khung dữ liệu của mình thành ma trận mở rộng cột yếu tố đơn thành nhiều cột và gán 1/0 tùy thuộc vào yếu tố. Ví dụChuyển đổi các yếu tố R thành các giá trị ma trận nhị phân

C1 C2 C3 
A 3 5 
B 3 4 
A 1 1 

nên biến thành một cái gì đó giống như

C1_A C1_B C2 C3 
1  0 3 5 
0  1 3 4 
1  0 1 1 

Làm thế nào tôi có thể làm điều này trong R? Tôi đã thử data.matrix, as.matrix không trả lại những gì tôi muốn. Chúng gán một giá trị "số nguyên" cho một cột yếu tố duy nhất, không có mở rộng.

Trả lời

15

Giả sử dat là khung dữ liệu của bạn:

cbind(dat, model.matrix(~ 0 + C1, dat)) 

    C1 C2 C3 C1A C1B 
1 A 3 5 1 0 
2 B 3 4 0 1 
3 A 1 1 1 0 

Giải pháp này hoạt động với bất kỳ số lượng yếu tố nào và không chỉ định tên cột theo cách thủ công.

Nếu bạn muốn loại trừ cột C1, bạn có thể sử dụng lệnh này:

cbind(dat[-1], model.matrix(~ 0 + C1, dat)) 
+10

OP dường như muốn 'model.matrix (~. + 0, dat)'. – Roland

+0

@Roland Ý tưởng hay +1. Điều này sẽ dễ dàng hơn. –

+1

@Sven, điều này làm việc, cảm ơn. Nó vẫn giữ C1 trong kết quả mặc dù (ngoài C1_A, C1_B cột), bất kỳ ý tưởng làm thế nào tôi sẽ loại bỏ cột ban đầu? Đây là một câu hỏi tổng quát hơn mặc dù (có thể), chỉ đơn giản là một cách dễ dàng R nói "cho tôi tất cả các cột ngoại trừ _that_ một" sẽ làm. – user423805

2

Hãy gọi data.frame bạn df:

library(reshape2) 
dcast(df,C2*C3~C1,fill=0,length) 

    C2 C3 A B 
1 1 1 1 0 
2 3 4 0 1 
3 3 5 1 0 
+1

Cám ơn cả những câu trả lời .. isnt Có cách nào để làm chuyển đổi này mà không chỉ định bất kỳ tên cột, như C1? Đơn giản chỉ cần .. chuyển đổi (df) và nó sẽ xử lý các yếu tố. lm() cũng như các phương thức hồi quy khác làm điều này bên trong phải không? – user423805

3
dat <- read.table(text =' C1 C2 C3 
A 3 5 
B 3 4 
A 1 1',header=T) 

Sử dụng chuyển đổi

transform(dat,C1_A =ifelse(C1=='A',1,0),C1_B =ifelse(C1=='B',1,0))[,-1] 
    C2 C3 C1_A C1_B 
1 3 5 1 0 
2 3 4 0 1 
3 1 1 1 0 

Hoặc để có được flexbility hơn, với within

within(dat,{ 
      C1_A =ifelse(C1=='A',1,0) 
      C1_B =ifelse(C1=='B',1,0)}) 

    C1 C2 C3 C1_B C1_A 
1 A 3 5 0 1 
2 B 3 4 1 0 
3 A 1 1 0 1 
Các vấn đề liên quan