Создать матрицу совместного появления из фиктивных наблюдений

Существует ли простой подход к преобразованию фрейма данных с использованием макетов о том, присутствует ли аспект, в матрицу совместного вхождения, содержащую подсчеты двух аспектов, происходящих одновременно?

Например. исходя из этого

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

Ответы на вопрос(1)

Решение Вопроса

Это сработает:

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)
 bdemarest16 мая 2012 г., 19:00
Интересно отметить, что диагональ - это просто суммы столбцов X.
 Josh O'Brien16 мая 2012 г., 19:15
@ bdemarest - также интересно рассмотреть сходство с дисперсионно-ковариационными матрицами, которые отличаются только центрированием столбцов перед вычислениемt(X) %*% X.
 Tyler Rinker16 мая 2012 г., 19:03
Очень хорошо; просто и легко + 1

Ваш ответ на вопрос