2012-05-16 16 views
6

¿Existe un enfoque simple para convertir un marco de datos con variables ficticias en si un aspecto está presente, en una matriz de co-ocurrencia que contiene los recuentos de dos aspectos simultáneos?Construir una matriz de co-ocurrencia a partir de observaciones dummycoded en R

E.g. pasando de esta

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 este

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

Respuesta

11

Esto va a hacer el truco:

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 

para obtener los resultados en un hoja.de.datos exactamente igual a la que mostró, que pueda a continuación, haga algo como:

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

Merece la pena señalar que la diagonal es simplemente la suma de columnas de X. – bdemarest

+0

Muy bonito; simple y fácil +1 –

+0

@bdemarest - También es interesante considerar la similitud con las matrices de varianza-covarianza, que difieren solo en centrar las columnas antes de calcular 't (X)% *% X'. –

Cuestiones relacionadas