-3

我有这个二进制矩阵

a0=rep(1,40)
a=rep(0:1,20)
b=c(rep(1,20),rep(0,20))
c0=c(rep(0,12),rep(1,28))
c1=c(rep(1,5),rep(0,35))
c2=c(rep(1,8),rep(0,32))
c3=c(rep(1,23),rep(0,17))
da=matrix(cbind(a0,a,b,c0,c1,c2,c3),nrow=40,ncol=7)

我需要将此矩阵子集化为具有相同列数和不同行数(例如 85% 对 15%)的两个子集(矩阵),但在修剪过程中,您可以记住这两个子集没有共线性。

我遇到的问题。当我使用 da 子集时

ind <- sample(1:nrow(da), trunc(85*nrow(da)/100)) 
trda <- da[ind,] 
teda <- da[-ind,]

我得到这些子集之一不是全等级。

有人可以向我解释如何在不产生共线性的情况下对它们进行子集化吗?这只是一个例子。我正在处理大矩阵

谢谢

4

1 回答 1

0

由于您的行中只有零和一,因此共线行是相同的行。

通过沿列粘贴计算行字符串:

> das = apply(da,1,paste,collapse="")
> das
 [1] "1010111" "1110111" "1010111" "1110111" "1010111" "1110011" "1010011"
 [8] "1110011" "1010001" "1110001" "1010001" "1110001" "1011001" "1111001"
[15] "1011001" "1111001" "1011001" "1111001" "1011001" "1111001" "1001001"
[22] "1101001" "1001001" "1101000" "1001000" "1101000" "1001000" "1101000"
[29] "1001000" "1101000" "1001000" "1101000" "1001000" "1101000" "1001000"
[36] "1101000" "1001000" "1101000" "1001000" "1101000"

然后快速测试是否可以完成是任何字符串是否出现超过两次:

> any(table(das)>2)
[1] TRUE

因为如果有两个以上,那么您的一个矩阵将至少有两个相同的行。例如,您在这里有八个 1001000 行。

如果可以的话,要进行实际的拆分,您只需将出现两次的每一行中的一行放入每个矩阵中,然后使用您喜欢的任何方法来拆分其余的行。

我们在这里正确吗?

于 2012-09-10T09:29:56.733 回答