2016-12-27 122 views
0

我有一个大的稀疏矩阵。现在我想做一对列的所有组合的列联表。 例如: 比方说,我的稀疏矩阵是垫稀疏矩阵的列联表

D1 D2 D3 D4 D5 .. Dn 
1 0 1 0 0 .. 0 
0 1 1 1 1 .. 1 
.. .. .. .. .. .. .. 
1 0 1 0 1 .. 1 

现在需要做出应急表例如用于应急表迪和Dj的所有组合的(D1,D2),(D1,D3), (D1,D4)...(D2,D3),(D2,D4)...(D2,Dn)...(Dn-1,Dn)

各应急表

r1 r2 
r3 r4 



#where r1 is total number of 1's in Di column 
#   r2 is total number of 1's in Di AND Dj column 
#   r3 is total number of 1's in Di AND Dj column 
#   r4 is total number of 1's in Dj column 

ALGO:

for each i in (1:n-1) { 
    for each j in (i+1 : n) { 
     Calculate r1,r2,r3,r4 
     create contingency table for Ri and Rj 
     apply fisher test on that 
    } 
} 

我想要一些快速的实施,因为它正在采取超过2-3天

回答

0

这里有一个主意,让所有的2×2个矩阵,

fun1 <- function(x,y){ 
matrix(data = c(sum(m1[,x]), sum(m1[,c(x,y)]), sum(m1[,c(x,y)]), sum(m1[,y])), 
                   nrow = 2, ncol = 2) 
} 
#where m1 is your original matrix 

ind1 <- combn(1:ncol(m1),2)[1,] 
ind2 <- combn(1:ncol(m1),2)[2,] 
final.list <- Map(fun1, ind1, ind2) 

head(final.list, 2) 
#[[1]] 
#  [,1] [,2] 
#[1,] 3 6 
#[2,] 6 3 

#[[2]] 
#  [,1] [,2] 
#[1,] 3 6 
#[2,] 6 3 

DATA

dput(m1) 
structure(c(0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1), .Dim = c(6L, 
6L), .Dimnames = list(NULL, c("D1", "D2", "D3", "D4", "D5", "D6" 
))) 

或者类似地,

fun2 <- function(x,y){ 
    matrix(data = c(c.sums[x], sum(c.sums[c(x,y)]), sum(c.sums[c(x,y)]), c.sums[y]), 
                    nrow = 2, ncol = 2) 
} 

ind1 <- combn(1:ncol(m1),2)[1,] 
ind2 <- combn(1:ncol(m1),2)[2,] 
c.sums <- colSums(m1) 

final.list2 <- Map(fun2, ind1, ind2) 
+0

谢谢。但它仍然需要很长时间。矩阵的维数为8000 * 7000.这意味着总C(7000,2)列联表。最初创建表的速度非常快,但过了一段时间后,它变得非常缓慢,最终陷入困境。 –

+0

7000列???你认为这意味着总数c(7000,2)...?这将产生大约2450万张桌子! – Sotos

+0

是的。这就是为什么它需要时间。 –