我正在尝试找到一种更快速的方法来计算会话中个人的出现,以便计算他们的关系水平。基本上,我想计算每两个人至少观察到其中一个人的次数。我在这里查看了解答,包括融化和acast,但没有找到使用它们的好方法。这是我效率低下的代码:
presence=array(0,c(8,10)) # session by individual
counter=array(0,c(10,10))
# put some data into the array:
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 0 1 0 0 0 0 0 0 0 0
[2,] 0 0 1 1 1 1 0 0 0 0
[3,] 0 0 0 0 0 0 1 0 0 0
[4,] 0 0 0 0 0 0 0 1 0 0
[5,] 0 0 0 0 0 0 0 1 0 0
[6,] 0 0 0 0 0 0 0 0 1 0
[7,] 0 0 0 0 0 0 0 0 1 0
[8,] 0 0 1 0 1 1 0 0 0 1
for (a in 1:10){
for (b in 1:10){
for (c in 1:8) {
if ((presence[c,a]>0)|(presence[c,b]>0)) counter[a,b]=counter[a,b]+1
# calculate something using this counter for each two individuals a and b
}
}
}
感谢您的帮助。 Amiyaal
答案 0 :(得分:0)
好的,仍然不是很清楚,但我认为存在现在是一个邻接矩阵,其中列代表用户,行代表事件,因此presence[i,j]
表示用户我参加了事件j。
如果我正确地解释它,那么计数似乎是共生矩阵,对吗? count[i,j]
应该记录用户i和j一起参加的活动数量?
如果您查看有关双模式社交网络分析的文献,特别是关联网络,可以直接计算:
count = t(presence)%*%presence
现在我会用你自己的数据检查一下,以确保它是准确的:只需在计数中随机检查几个细胞并将它们与存在进行比较。
另外,对于这些类型的矩阵,行通常是用户,事件是列。
编辑:如果您想要计数是用户参加的事件数量(而不是他们参加的事件数量),那么它就是一个联合而不是一个交集。因此,用户参加的事件数量+用户j参加的事件数量 - 交叉点
x = t(presence)%*%presence
numEvents = diag(x)
counts = matrix(rep(numEvents,dim(x)[1]),nrow=dim(x)[1],byrow=TRUE)+matrix(rep(numEvents,dim(x)[1]),nrow=dim(x)[1],byrow=FALSE)-x
这不是最优雅的解决方案,但应该有效