2017-10-06 1 views
0

Disons que j'ai une matrice avec (r1, ... rm) lignes et (c1, c2, ... cn) tous les éléments sont des 0 et des 1.Calcul des nombres de 0 et 1 pour différentes combinaisons de colonnes

Je voudrais compter le nombre total de 0 et de 1 pour différentes combinaisons: par exemple, c1 & c2, c1 & c3, c1 & c3, c1 & c2 & c3, c1 & c3 & c4.

Existe-t-il un moyen efficace de les compter? Je le fais mal comme ça, où les données sont ma matrice.

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

Exemples:

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

Je préfère ne pas calculer c1 ou c2 pour chaque combinaison ils apparaissent, et l'indice gardant pourrait être un problème de mémoire lorsque m (nrow (données)) est grand .

Tout conseil serait apprécié.

Répondre

0

Mon idée serait de convertir la matrice en une trame de données en utilisant reshape2

df <- as.data.frame(your_matrix) 

Ensuite, vous pouvez facilement résumer les colonnes et les enregistrer dans une autre variable

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 

vous pouvez ensuite utiliser ces vecteurs pour vos combinaisons. Par exemple: combien y en a-t-il dans la colonne 2 et combien y en a-t-il dans la colonne 4?

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

Quel est le motif pour l'importation 'reshape2'? – Bernhard

+0

Cela fonctionne, mais je pense que mes fonctions fonctionnent aussi, mais pas de mémoire efficace. Si je veux savoir c1 &! C4 & c5, alors j'ai besoin de le calculer à partir de zéro, mais vous savez quelles lignes sont c1 &! C4 d'en haut. –

+0

Désolé, le reshape2 - import n'était pas nécessaire. Je l'ai enlevé, merci de le signaler. – 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 

Vous pouvez créer un objet multi dimensions contenant tous les résultats, puis sélectionnez les valeurs dont vous avez besoin:

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

Merci, mais pour une grande matrice n'est pas pratique, lorsque n & m sont supérieurs à 100000. –

+0

Dans votre exemple: c1 & c2 = 0, c1 & c3 = 1,! C1 &! C2 = 2. Votre réponse ne me donne pas ce que je veux. Je veux avoir une fonction qui conserve le calcul précédent, donc il ne le fait pas à chaque fois. –