2012-05-16 11 views
6

C'è un approccio semplice alla conversione di un dataframe con manichini sulla presenza di un aspetto, su una matrice di co-occorrenza contenente i conteggi di due aspetti che si verificano?Creazione di una matrice di co-occorrenza da osservazioni dummycoded in R

E.g. passando da questo

X <- data.frame(rbind(c(1,0,1,0), c(0,1,1,0), c(0,1,1,1), c(0,0,1,0))) 
X 
    X1 X2 X3 X4 
1 1 0 1 0 
2 0 1 1 0 
3 0 1 1 1 
4 0 0 1 0 

a questo

X1 X2 X3 X4 
X1 0 0 1 0 
X2 0 0 2 1 
X3 1 2 0 1 
X4 0 1 1 0 

risposta

11

Questo farà il trucco:

X <- as.matrix(X) 
out <- crossprod(X) # Same as: t(X) %*% X 
diag(out) <- 0  # (b/c you don't count co-occurrences of an aspect with itself) 
out 
#  [,1] [,2] [,3] [,4] 
# [1,] 0 0 1 0 
# [2,] 0 0 2 1 
# [3,] 1 2 0 1 
# [4,] 0 1 1 0 

per ottenere i risultati in un data.frame esattamente come quella che avete mostrato, è possibile quindi fare qualcosa come:

nms <- paste("X", 1:4, sep="") 
dimnames(out) <- list(nms, nms) 
out <- as.data.frame(out) 
+0

Interessante da notare che la diagonale è semplicemente la somma delle colonne di X. – bdemarest

+0

Molto bella; semplice e facile +1 –

+0

@bdemarest - interessante considerare anche la somiglianza di varianza-covarianza matrici, che differiscono solo per il centraggio delle colonne prima di calcolare 't (X)% *% rinfusa. –

Problemi correlati