2012-05-16 16 views
6

Czy istnieje proste podejście do konwersji ramki danych z manekinami na to, czy dany aspekt jest obecny, do macierzy współwystępowania zawierającej liczby dwóch współdziałających aspektów?Konstruowanie matrycy współwystępowania z dyblikowanych obserwacji w R

E.g. począwszy od tego

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 

do tego

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

Odpowiedz

11

Ten rade:

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 

aby uzyskać wyniki w data.frame dokładnie tak jak ten, który pokazał, można następnie zrób coś takiego:

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

Interesująca do uwagi że przekątna to po prostu sumy kolumn X. – bdemarest

+0

Bardzo ładne; prosty i łatwy +1 –

+0

@bdemarest - Warto również rozważyć podobieństwo do macierzy wariancyjno-kowariancyjnych, które różnią się jedynie centrowaniem kolumn przed obliczeniem 't (X)% *% X'. –

Powiązane problemy