2017-10-06 68 views
0

假设我有(r1,... rm)行和(c1,c2,... cn)矩阵,所有元素都是0和1。针对不同列的组合计算0和1的数字

我想数0和1的总数为不同的组合:例如,C1 & C2,C1 & C3,C1 & C3,C1 & C2 & C3,C1 & C3 C4 &。

有没有一种有效的方法来计算这些?

我这样做很差,其中数据是我的矩阵。

is.one <- function(data,zero.one) 
{ 
     #zero.one is logical , T, counting 1, otherwise 0s. 

     if (zero.one) 
      return (data==1) 
     else 
      return (data==0) 
} 

sum.one <- function(data, comb, zero.one) 
{ 
     #comb is one of the combinations as a vector 
     index<- rep(T,nrow(data)) 

     for (i in 1: length(comb)) 
     { 
      # assuming i-th column is the i-th element of combination 
      index <- is.one(data[,i], zero.one[i]) 
      data <- data[index,] 
     } 

     return(sum(index)) 
} 

例子:

sum.one (data, c("c1","c2"), c(1,1)) 

sum.one (data, c("c1","c2","c3"), c(1,1,1)) 

sum.one (data, c("c1","c2","c3"), c(1,1,0)) 

我宁愿不计算C1或C2他们出现在每个组合,并保持指数可能是内存问题当m(nrow(数据))是大。

任何意见,将不胜感激。

回答

0

我的想法是将矩阵转换为使用reshape2

df <- as.data.frame(your_matrix) 

然后你就可以轻松地总结出列,并将它们保存在另一个变量

df <- data.frame(
    c1 = sample(c(0, 1), replace = TRUE, size = 100), 
    c2 = sample(c(0, 1), replace = TRUE, size = 100), 
    c3 = sample(c(0, 1), replace = TRUE, size = 100), 
    c4 = sample(c(0, 1), replace = TRUE, size = 100) 
) 

    ones <- as.numeric(colSums(df)) 
    zeros <- as.numeric(NROW(df) - ones) 


> ones 
c1 c2 c3 c4 
39 45 41 50 

> zeros 
c1 c2 c3 c4 
61 55 59 50 

一个数据帧,那么你可以使用这些矢量为您的组合。例如:列2中有多少个,列4中有多少个0?

> answer <- as.numeric(ones[2] + zeros[4]) 
> answer 
[1] 95 
+1

任何理由进口'reshape2'? – Bernhard

+0

虽然有效,但我认为我的功能也可以正常工作,但不能提高内存效率。如果我想知道c1&!c4&c5,那么我需要从头开始计算它,但是您知道哪些行是上面的c1&!c4。 –

+0

对不起,reshape2 - 导入没有必要。我已经删除它,谢谢指出它。 – brettljausn

0
data <- matrix(c(1, 0, 0, 0, 0, 0, 1, 0, 1), 3, 3) 
rownames(data) <- paste0("r", 1:nrow(data)) 
colnames(data) <- paste0("c", 1:ncol(data)) 
data 
# c1 c2 c3 
# r1 1 0 1 
# r2 0 0 0 
# r3 0 0 1 

你可以创建一个包含所有结果的多维对象,然后选择您需要的值:

x <- colSums(data) 
y <- colSums(data==0) 
names(y) <- paste0(names(y), "_0") 
o1 <- outer(x, y, FUN = "+") 
o1 
# c1_0 c2_0 c3_0 
# c1 3 4 2 
# c2 2 3 1 
# c3 4 5 3 

o2 <- outer(o1, y, FUN = "+") 
o2 
# , , c1_0 
# 
# c1_0 c2_0 c3_0 
# c1 5 6 4 
# c2 4 5 3 
# c3 6 7 5 
# 
# , , c2_0 
# 
# c1_0 c2_0 c3_0 
# c1 6 7 5 
# c2 5 6 4 
# c3 7 8 6 
# 
# , , c3_0 
# 
# c1_0 c2_0 c3_0 
# c1 4 5 3 
# c2 3 4 2 
# c3 5 6 4 

o2[1, 1, 2] 
# [1] 6 
+0

谢谢,但这对于一个大矩阵是不实际的,当n&m大于100000时。 –

+0

在你的例子中:c1&c2 = 0,c1&c3 = 1,!c1&!c2 = 2。你的回应并没有给我我想要的。我想有一个保持以前计算的函数,所以它不会每一次都这样做。 –