我想你想要一些交叉產品的版本。
# construct the matrix
myMat <- as.matrix(df[-1])
# same output as myMat %*% t(myMat)
resultMat <- tcrossprod(myMat)
# add names
dimnames(resultMat) <- list(df$name, df$name)
resultMat
Joe Jane Jill
Joe 2 1 2
Jane 1 1 1
Jill 2 1 2
關閉對角線顯示了個人投票的同時和對角線給出的個人多少次自己(即,其總的投票)投票計數實例計數。
既然你不想每個人的總投票數,你可以用0代替對角線。
# remove diagonal
diag(resultMat) <- 0
resultMat
Joe Jane Jill
Joe 0 1 2
Jane 1 0 1
Jill 2 1 0
增加兩個額外的票,並在下面DF1兩個額外的選民。有一位名叫薩爾的選民只投了一票2,是唯一的選民。
df1
name vote1 vote2 vote3 vote4 vote5
1 Joe 1 0 1 0 1
2 Jane 0 0 1 1 0
3 Jill 1 0 1 1 0
4 Bob 1 0 1 1 0
5 Sal 0 1 0 0 0
通過上述過程與此更大的矩陣運行,我們得到
resultMat
Joe Jane Jill Bob Sal
Joe 0 1 2 2 0
Jane 1 0 2 2 0
Jill 2 2 0 3 0
Bob 2 2 3 0 0
Sal 0 0 0 0 0
這都說明在所有薩爾的插槽和3S鮑勃 - 吉爾吉爾 - 鮑勃插槽0,因爲它們都在投相同的3票。
數據
df <-
structure(list(name = structure(c(3L, 1L, 2L), .Label = c("Jane",
"Jill", "Joe"), class = "factor"), vote1 = c(1L, 0L, 1L), vote2 = c(0L,
0L, 0L), vote3 = c(1L, 1L, 1L)), .Names = c("name", "vote1",
"vote2", "vote3"), class = "data.frame", row.names = c(NA, -3L))
df1 <-
structure(list(name = structure(c(4L, 2L, 3L, 1L, 5L), .Label = c("Bob",
"Jane", "Jill", "Joe", "Sal"), class = "factor"), vote1 = c(1L,
0L, 1L, 1L, 0L), vote2 = c(0L, 0L, 0L, 0L, 1L), vote3 = c(1L,
1L, 1L, 1L, 0L), vote4 = c(0L, 1L, 1L, 1L, 0L), vote5 = c(1L,
0L, 0L, 0L, 0L)), .Names = c("name", "vote1", "vote2", "vote3",
"vote4", "vote5"), class = "data.frame", row.names = c(NA, -5L))
這正是我需要的。我最終使用'data.matrix'而不是'as.matrix',但這是唯一的修改。 –
不錯。我忘了那個功能。很好的發現。 – lmo