我想对 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/