Одним из подходов может быть использование outer
.Здесь определяется вспомогательная функция comp_cols
, которая берет два вектора имен столбцов и вычисляет, равны ли соответствующие столбцы dat
.
# slightly modified data.frame from question
dat <- data.frame(x1=c(1,0,0,1,1), x2=c(1,1,0,0,1), x3=c(1,1,0,1,1), x4=c(1,0,0,1,1))
# compare function
comp_cols <- function(x,y) {
ans <- rep(NA, length(x))
for (i in seq_along(x)) ans[i] <- all(dat[,x[i]]==dat[,y[i]])
return(ans)
}
# compare each combination
res <- outer(colnames(dat), colnames(dat), FUN=comp_cols)
rownames(res) <- colnames(dat)
colnames(res) <- colnames(dat)
Это, вероятно, не самое эффективное решение, так какМатрица результата симметрична и, следовательно, требуется только половина расчетов.Если время вычислений является проблемой, использование combn
может быть быстрее.