Try
m1 <- t(df1[-1])
colnames(m1) <- df1[,1]
tcrossprod(m1)
# C1 C2 C3 C4
#C1 3 0 1 1
#C2 0 3 2 0
#C3 1 2 7 0
#C4 1 0 0 1
As for the part subset, I do not get the expected result,
df1 <- df1[rowSums(df1[-1])==2,]
m1 <- t(df1[-1])
colnames(m1) <- df1[,1]
tcrossprod(m1)
data
df1 <- structure(list(KEY = c("A", "B", "C", "D", "E", "F", "G", "H",
"I", "J"), C1 = c(0L, 0L, 0L, 0L, 1L, 1L, 0L, 0L, 0L, 1L), C2 = c(0L,
0L, 1L, 0L, 0L, 0L, 1L, 0L, 1L, 0L), C3 = c(1L, 1L, 1L, 1L, 1L,
0L, 0L, 1L, 1L, 0L), C4 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
1L)), .Names = c("KEY", "C1", "C2", "C3", "C4"), class = "data.frame",
row.names = c(NA, -10L))