-5

我试图找到一种更快的方法来总结会话中个体的出现,以计算他们的关系水平。基本上,我想为每两个人计算至少观察到其中一个人的次数。我在这里查看了包括melt 和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
      }
    }
  }

谢谢您的帮助。阿米亚尔

4

1 回答 1

0

好的,仍然不是很清楚,但我认为存在现在是一个邻接矩阵,其中列代表用户,行代表事件,因此presence[i,j]表示用户 i 参加了事件 j。

如果我解释正确,那么计数似乎是共现矩阵,对吗? count[i,j]应该记录用户 i 和 j 一起参加的活动数量吗?

如果您查看有关 2 模式社交网络分析的文献,特别是从属网络,则可以直接计算:

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

这不是最优雅的解决方案,但它应该可以工作

于 2013-03-04T21:38:48.423 回答