2013-03-04 89 views
-5

我试图找到一个更快的方式来总结个人在会话中的发生,以便计算他们的关系水平。基本上,我想为每两个人计算至少有一次观察到的次数。我已经在这里查看了答案,包括融合和慷慨,但没有找到使用它们的好方法。这是我的低效代码:R创建矩阵的发生

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

我认为你需要解释你问题多一点,我不知道这里发生了什么。你的原始数据是什么样的?这代码在哪里代表?如果你想从原始数据中计算事件中的同时发生的人,那么这当然是可能的,我会建议看看一些igraph社交网络分析库。 – slammaster 2013-03-04 20:54:23

+0

你的问题如上所述没有任何意义。您使用该声明,“在多年的会话中对个人的会话进行总结”而不定义任何条款,并且您提供的代码是垃圾。 – N8TRO 2013-03-04 20:59:21

+0

在场数组存储哪些人在第i年的会话c中出现。内循环计算一年中至少有一人(a或b)出现的次数(即总计所有会话)。我希望现在更清楚。 – user2133354 2013-03-04 21:01:27

回答

0

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

如果我正确解释,那么计数似乎是共生矩阵,对吗? count[i,j]应记录我和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 

这不是最完美的解决方案,但它应该工作

+0

谢谢,但这不是我正在寻找的,因为它计算CO-OCCURRENCE,而我想要计算所有至少有一个人在场的情况。 – user2133354 2013-03-04 21:51:53