时间:2017-10-06 05:25:14

标签: r matrix

让我们说我有(r1,... rm)行的矩阵和(c1,c2,... cn)所有元素都是0' s和1' s。 / p>

我想计算不同组合的总数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(data))很大时保持索引可能是一个内存问题。

任何建议都将受到赞赏。

2 个答案:

答案 0 :(得分: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列中有多少个?

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

答案 1 :(得分: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