2014-08-27 58 views
0

我有一個獨立的因素,長度79如何cbind離散係數大矩陣

[1] 4 6 6 4 6 1 6 4 1 6 1 4 6 1 1 1 6 6 6 6 6 4 1 6 6 4 6 6 1 1 6 4 6 1 6 6 4 4 
[39] 6 6 4 1 1 4 1 1 6 1 1 6 6 1 1 6 4 1 1 6 1 6 6 1 6 6 6 6 1 1 1 1 6 1 1 1 1 1 
[77] 6 6 1 
Levels: 1 4 6 

我想這個離散係數cbind一個大型矩陣尺寸爲:1921年79個行。我被告知我的最終結果應該是添加了列的原始矩陣,但我不知道我應該如何處理這個問題。提前致謝。

這是我被給了因子cbind到矩陣的代碼:

dd1 = mat.x 
for(v in levels(X)){ 
    nv = rep(0, length(X)) 
    nv[X==v] = 1 
    dd1 = cbind(dd1, nv) 
} 

我得到這樣的警告消息:

警告消息:

1:在cbind( dd1,nv):

結果行數不是矢量長度的倍數(參數2)

2:在cbind(DD1,NV):

數結果的行的不向量長度的整數倍(ARG 2)

3:在cbind(DD1,NV):

數結果的行的不向量長度的整數倍(ARG 2)

+0

不能用矩陣做。也許是一個數據框?矩陣列必須全部相同'class' – 2014-08-27 20:18:27

+0

您是否確實嘗試過'cbind'?我不明白爲什麼'mat <--cbind(mat,vec)'不應該起作用(其中'mat'是你的矩陣,'vec'是你的因子向量) – 2014-08-27 20:22:44

+0

這將起作用,但因式矢量將不再是因爲 – 2014-08-27 20:26:18

回答

1

我認爲你的問題只是一個錯字。使用樣本數據

mat.x <- matrix(1, nrow=17, ncol=4) 
X <- factor(sample(c(4,6,10), 17, replace=T)) 

此代碼工作

dd1 = mat.x 
for(v in levels(X)){ 
    nv = rep(0, length(X)) 
    nv[X==v] = 1 
    dd1 = cbind(dd1, nv) 
} 

注意,我不得不改變nv[y==v] = 1nv[X==v] = 1因爲你沒有在你的問題定義y任何地方。

+0

使用'cbind(mat.x,model.matrix(〜X-1))'會不會更好/更高效? – 2014-08-27 20:54:31

+0

當然。我想我只是想弄清楚爲什麼代碼不起作用。 – MrFlick 2014-08-27 20:55:52

+0

聖摩爾,你是對的!我現在踢自己。謝謝。 – 2014-08-27 21:04:55

0

matrix所有元素都必須是相同的類。使用data.frame或data.table代替

data.frame(vec, mat)