2012-12-16 73 views
12

我想將我的數據框轉換爲矩陣,將單因子列擴展爲多個矩陣,並根據因子分配1/0。例如將R因子轉換爲二進制矩陣值

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

應該變成像

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

如何在R中可以做到這一點?我試過data.matrix,as.matrix,它沒有返回我想要的東西。他們將「整數」值分配給單個因子列,沒有擴展。

回答

15

假設dat是您的數據幀:

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 

該解決方案適用於任何數量的因子水平,並沒有手動指定列名。

如果你想排除列C1,你可以使用這個命令:

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

OP似乎想要'model.matrix(〜。+ 0,dat)'。 – Roland

+0

@Roland好主意+1。這會更容易。 –

+1

@Sven,這工作,謝謝。儘管(除了C1_A,C1_B列),它仍然保持C1的結果,任何想法我將如何刪除原始列?儘管(也許)這是一個更爲普遍的問題,但只是一種簡單的R表達方式,即「給我所有列除_that_之外」都可以。 – user423805

2

讓我們把你的data.frame 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

感謝兩個答案..心不是有沒有辦法做到這一點的轉換不指定任何列名,如C1?簡單地說,轉換(DF),它會處理因素。 lm()以及其他迴歸方法在內部是否正確? – user423805

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

使用轉換

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 

或者獲得更多的flexbility,與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 
相關問題