2017-02-21 5 views
3

Mes données ressemble à ceci, toutes les colonnes avec des données de présence binaire/absence:onglets Cross - Nécessité de regrouper plusieurs colonnes en fonction de certaines valeurs dans d'autres colonnes

POP1 POP2 POP3 T1 T2 T3 T4 T5 T6 T7 T8 T9 
1  1  0  1  1  1  1  0  1  0  0  1 
1  0  1  0  1  1  0  1  1  0  1  1 
1  1  0  1  1  1  1  0  0  1  0  1 
0  0  0  0  1  1  0  1  0  1  1  0 
1  0  1  0  0  1  1  1  0  1  1  0 
0  1  0  0  1  1  1  0  0  0  0  1 
0  1  0  1  1  0  1  0  0  0  0  0 
1  1  1  0  1  0  0  0  1  0  0  0 
0  0  0  0  1  1  1  1  1  0  0  1 
1  0  0  1  0  1  0  1  0  1  1  1 
1  1  0  0  1  0  1  0  0  1  0  0 
1  0  1  0  1  1  1  0  1  0  1  0 
0  1  0  1  1  1  1  0  0  0  0  0 
1  0  0  0  1  1  0  0  0  0  1  1 

Le POP1: POP3 sont les populations, et j'ai besoin compte de tous les 1 pour tous T1: T9 pour tous POP1 = 1, POP2 = 1 et POP3 = 1. Je besoin d'une table qui crosstabulates mes données comme ceci:

  T1 T2 T3 T4 T5 T6 T7 T8 T9 
POP1=1 3  9  7  5  3  4  4  5  5 
POP2=1 4  7  8  6  2  3  2  0  3 
POP3=1 0  3  4  2  2  2  1  3  1 

Ne pas pris la peine de vérifier les comptes agrégés, ils ne sont pas nécessairement correctes. J'ai essayé beaucoup de synthax sans avoir ce que je veux. Reconnaissant pour quelques conseils.

Répondre

4

Vous avez besoin de la multiplication matricielle %*% ici:

t(df[1:3]) %*% as.matrix(df[4:12]) 

    T1 T2 T3 T4 T5 T6 T7 T8 T9 
POP1 3 7 7 5 3 4 4 5 5 
POP2 4 7 4 6 0 2 2 0 3 
POP3 0 3 3 2 2 3 1 3 1 
+0

Lorsque vous utilisez cette synthaxe sur mes données réelles, où il y a beaucoup plus de colonnes que je reçois cette erreur: Erreur dans t (sysrev60 [85: 103])% *% as.matrix (sysrev60 [40:68]): nécessite des arguments numériques/matriciels/vectoriels complexes. Trop de colonnes? – Dag

+0

Peut-être que certaines de vos colonnes ne sont pas numériques, vous pouvez vérifier les classes de colonnes avec 'lapply (sysrev60, class)'. – Psidom

+0

Je viens de vérifier. Ils sont tous numériques. – Dag

2
df = structure(list(POP1 = c(1L, 1L, 1L, 0L, 1L, 0L, 0L, 1L, 0L, 1L, 
1L, 1L, 0L, 1L), POP2 = c(1L, 0L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 
0L, 1L, 0L, 1L, 0L), POP3 = c(0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L, 
0L, 0L, 0L, 1L, 0L, 0L), T1 = c(1L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 
0L, 1L, 0L, 0L, 1L, 0L), T2 = c(1L, 1L, 1L, 1L, 0L, 1L, 1L, 1L, 
1L, 0L, 1L, 1L, 1L, 1L), T3 = c(1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 
1L, 1L, 0L, 1L, 1L, 1L), T4 = c(1L, 0L, 1L, 0L, 1L, 1L, 1L, 0L, 
1L, 0L, 1L, 1L, 1L, 0L), T5 = c(0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 
1L, 1L, 0L, 0L, 0L, 0L), T6 = c(1L, 1L, 0L, 0L, 0L, 0L, 0L, 1L, 
1L, 0L, 0L, 1L, 0L, 0L), T7 = c(0L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 
0L, 1L, 1L, 0L, 0L, 0L), T8 = c(0L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 
0L, 1L, 0L, 1L, 0L, 1L), T9 = c(1L, 1L, 1L, 0L, 0L, 1L, 0L, 0L, 
1L, 1L, 0L, 0L, 0L, 1L)), .Names = c("POP1", "POP2", "POP3", 
"T1", "T2", "T3", "T4", "T5", "T6", "T7", "T8", "T9"), class = "data.frame", 
row.names = c(NA, -14L)) 

library(reshape2) 
df = melt(df, id.vars = colnames(df)[-(1:3)]) 

do.call(rbind, lapply(split(df, df$variable), function(x) 
        apply(x[x$value == 1,1:9], 2, function(y) sum(y)))) 

#  T1 T2 T3 T4 T5 T6 T7 T8 T9 
#POP1 3 7 7 5 3 4 4 5 5 
#POP2 4 7 4 6 0 2 2 0 3 
#POP3 0 3 3 2 2 3 1 3 1 
+0

J'ai essayé ceci et j'ai reçu le message d'erreur: Erreur dans split.default (x = seq_len (nrow (x)), f = f, drop = drop, ...): la longueur du groupe est 0 mais la longueur des données> 0 – Dag