2017-10-06 8 views
0

行列は(r1、... rm)の行を持ち、(c1、c2、... cn)すべての要素が0と1であるとします。異なる列の組み合わせに対して0と1の数を計算する

私は、異なる組み合わせのために、0と1の合計数をカウントしたいと思います!例えば、C1 & C2は、C1 & C3、C1、C2 & & C3、C1 & C3 & C4 & C3、C1。

これを有効にカウントする方法はありますか?

私はそれがデータの行列であるこのようにあまりよくありません。

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)) 
} 

例:メートル(nrow(データ))が大きいときに私は、彼らが表示され、すべての組み合わせについて、C1、またはC2を計算し、インデックスを維持するというではないと思います

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)) 

メモリの問題かもしれません。

アドバイスをいただければ幸いです。

答えて

0

私の考えでは、あなたが簡単に列を総括し、別の変数

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 

に保存することができreshape2

df <- as.data.frame(your_matrix) 

を使用してデータフレームに行列を変換することです、あなたは、これらを使用することができますあなたの組み合わせのベクトル。たとえば、列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。あなたの反応は、私が望むものを私に与えるものではありません。前回の計算を保持する関数が必要なので、毎回それを行うわけではありません。 –