R创建一个出现矩阵

时间:2013-03-04 20:50:40

标签: arrays r matrix

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

1 个答案:

答案 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

这不是最优雅的解决方案,但应该有效