2012-05-16 62 views
6

是否存在一種簡單的方法來將數據框與虛擬變量關於是否存在方面轉換爲包含兩個方面共發生計數的共現矩陣?根據虛擬編碼觀測值構造一個共現矩陣R

E.g.從這個

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 

去這個

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

回答

11

這將這樣的伎倆:

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 

要得到的結果爲data.frame酷似一個你表明,你可以然後做類似的事情:

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

有意思對角線就是X的列總和。 – bdemarest

+0

非常好;簡單易行+1 –

+0

@bdemarest - 考慮與方差 - 協方差矩陣的相似性也很有趣,它們在計算't(X)%*%X'之前只有在對列進行中心化時纔有所不同。 –