我想將我的數據框轉換爲矩陣,將單因子列擴展爲多個矩陣,並根據因子分配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
,它沒有返回我想要的東西。他們將「整數」值分配給單個因子列,沒有擴展。
我想將我的數據框轉換爲矩陣,將單因子列擴展爲多個矩陣,並根據因子分配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
,它沒有返回我想要的東西。他們將「整數」值分配給單個因子列,沒有擴展。
假設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))
讓我們把你的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
感謝兩個答案..心不是有沒有辦法做到這一點的轉換不指定任何列名,如C1?簡單地說,轉換(DF),它會處理因素。 lm()以及其他迴歸方法在內部是否正確? – user423805
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
OP似乎想要'model.matrix(〜。+ 0,dat)'。 – Roland
@Roland好主意+1。這會更容易。 –
@Sven,這工作,謝謝。儘管(除了C1_A,C1_B列),它仍然保持C1的結果,任何想法我將如何刪除原始列?儘管(也許)這是一個更爲普遍的問題,但只是一種簡單的R表達方式,即「給我所有列除_that_之外」都可以。 – user423805