我有一个数据框架,代表不同的人的策略偏好,其中行代表个人。
这里是一个玩具的例子;弗兰克"Sarah"Josh;以及";Elyse";。在这个例子中,参与者表示支持三项政治政策(减税、全民医疗、延长任期(;1〃;代表背书和";0";代表对该政策的反对。
d<-data.frame("Name"=c("Frank","Sarah","Josh","Elyse"),
"tax_cuts"=c(0,1,1,1),
"u_healthcare"=c(1,1,0,0),
"ex_term"=c(0,0,1,0))
d
Name tax_cuts u_healthcare ex_term
Frank 0 1 0
Sarah 1 1 0
Josh 1 0 1
Elyse 1 0 0
我如何创建一个矩阵,其中边表示保单的共同背书数量。例如,Sarah共同支持减税和延长任期限制,而Josh共同支持延长任期限制和减税,因此这些政策将有1个共同支持。得到的矩阵将是具有以下值的3-3平方矩阵。
mat<-rbind(c(0, 1, 1),c(1,0,0), c(1,0,0))
rownames(mat)<-c("tax_cuts","u_healthcare","ex_term")
colnames(mat)<-c("tax_cuts","u_healthcare","ex_term")
print(mat)
tax_cuts u_healthcare ex_term
tax_cuts 0 1 1
u_healthcare 1 0 0
ex_term 1 0 0
我们可以用矩阵乘法来实现这一点:
t(d[-1]) %*% as.matrix(d[-1])
tax_cuts u_healthcare ex_term
tax_cuts 3 1 1
u_healthcare 1 2 0
ex_term 1 0 1
对角线是每个单独背书的计数。如果您愿意,可以将其设置为0。。。
coendorse = t(d[-1]) %*% as.matrix(d[-1])
diag(coendorse) = 0
coendorse
# tax_cuts u_healthcare ex_term
# tax_cuts 0 1 1
# u_healthcare 1 0 0
# ex_term 1 0 0
使用crossprod
crossprod(as.matrix(d[-1]), as.matrix(d[-1]))
# tax_cuts u_healthcare ex_term
#tax_cuts 3 1 1
#u_healthcare 1 2 0
#ex_term 1 0 1