2014-08-27 66 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)