R:矩阵计数比赛,当 2 支球队按计划进行互动时,每场比赛有 3 名参与者

标签 r algorithm matrix

我想对 FIRST 机器人团队进行一些计算,并且由于缺乏更好的词而需要构建一个二元交互矩阵。那是两支球队在同一个联盟的时候。每个联盟有 3 支球队,因此在考虑 (i,j)、(j,i) 和 (i,i) 时,每场比赛的 7 个值被添加到矩阵中。

我使用的完整数据在这里:http://frc-events.firstinspires.org/2016/MOKC/qualifications

但为简单起见,这里以 9 支球队各打一场比赛为例。

> data.frame(Team.1=1:3,Team.2=4:6,Team.3=7:9)
  Team.1 Team.2 Team.3
1      1      4      7
2      2      5      8
3      3      6      9

矩阵应计算每个二元交互,(1,4),(4,7),(3,6),(6,3),(9,9) 等,并且将是 N x N矩阵,其中在上面的例子中 N=9。这是表示上述列表的矩阵:

> matrix(data=c(1,0,0,1,0,0,1,0,0,+
+ 0,1,0,0,1,0,0,1,0,+
+ 0,0,1,0,0,1,0,0,1,+
+ 1,0,0,1,0,0,1,0,0,+
+ 0,1,0,0,1,0,0,1,0,+
+ 0,0,1,0,0,1,0,0,1,+
+ 1,0,0,1,0,0,1,0,0,+
+ 0,1,0,0,1,0,0,1,0,+
+ 0,0,1,0,0,1,0,0,1),9,9)
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
 [1,]    1    0    0    1    0    0    1    0    0
 [2,]    0    1    0    0    1    0    0    1    0
 [3,]    0    0    1    0    0    1    0    0    1
 [4,]    1    0    0    1    0    0    1    0    0
 [5,]    0    1    0    0    1    0    0    1    0
 [6,]    0    0    1    0    0    1    0    0    1
 [7,]    1    0    0    1    0    0    1    0    0
 [8,]    0    1    0    0    1    0    0    1    0
 [9,]    0    0    1    0    0    1    0    0    1

在真实数据中,球队编号不是连续的,更像是 5732、1345、3451 等,每个球队有更多的比赛,这意味着矩阵值将介于 0 和最大比赛数之间参加比赛的球队。这在真实数据中可以看出。

感谢任何可以提供帮助的人。

最佳答案

可能有更优雅的方法,但这里是使用 data.table 的方法。

library(data.table)
dat <- data.table(Team.1=1:3,Team.2=4:6,Team.3=7:9)

#add match ID
dat[,match:=1:.N]
#turn to long
mdat <- melt(dat,id="match",value.name="team")[,variable:=NULL]

#merge with itself
dat2 <- merge(mdat, mdat, by=c("match"),all=T, allow.cartesian = T)

# reshape
dcast(dat2, team.x~team.y, fun.agg=length)

   team.x 1 2 3 4 5 6 7 8 9
1:      1 1 0 0 1 0 0 1 0 0
2:      2 0 1 0 0 1 0 0 1 0
3:      3 0 0 1 0 0 1 0 0 1
4:      4 1 0 0 1 0 0 1 0 0
5:      5 0 1 0 0 1 0 0 1 0
6:      6 0 0 1 0 0 1 0 0 1
7:      7 1 0 0 1 0 0 1 0 0
8:      8 0 1 0 0 1 0 0 1 0
9:      9 0 0 1 0 0 1 0 0 1

而且,因为我可以,一个在 base-R 中。我认为使用 for 循环是合理的(因为您不断修改同一个对象)。

#make matrix to put results in

nteams = length(unique(unlist(dat)))
res <- matrix(0,nrow=nteams, ncol=nteams)


#split data by row, generate combinations for each row and add to matrix
for(i in 1:nrow(dat)){
  x=unlist(dat[i,])
  coords=as.matrix(expand.grid(x,x))
  res[coords] <- res[coords]+1
}

关于R:矩阵计数比赛,当 2 支球队按计划进行互动时,每场比赛有 3 名参与者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36101329/

相关文章:

在c中复制矩阵

C++:访问冲突

regex - 将数据框元素转换为R中的字符串

r - 按组对多个分位数进行 ddply

algorithm - NP优化问题(定义)

java - 在彼此一定距离内的数组中查找最大值

java - 在java中将大文件的数据缓存在内存中

python - 在 sympy 中切片符号 block 矩阵时保留维度

r - 在每个单词的开头添加一个字符

r - 如何在R中使用if containsimilar,then