2017-07-07 89 views
2

假设我有以下数据:的R - 填充计数资料矩阵

df <- data.frame(teams=c("A", "B", "C", "D"), 
      players=c(5,2,1,2), 
      stringsAsFactors = FALSE) 

> df 
    teams players 
1  A  5 
2  B  2 
3  C  1 
4  D  2 

我要填写类似于一个球员的配对组合在一个团队中所有其他玩家在所有其他的加权4x4矩阵团队。

有了这个例子中,输出应该是这样的:

m <- matrix(c(4,2,1,2,5,1,1,2,5,2,0,2,5,2,1,1), nrow=4, ncol=4) 
colnames(m) <- df$teams 
rownames(m) <- df$teams 

> m 
    A B C D 
A 4 5 5 5 
B 2 1 2 2 
C 1 1 0 1 
D 2 2 2 1 

注意,从A队一名球员可以玩:

  • 4从球队其他球员一个
  • 2个玩家来自B队
  • 1队的球员C
  • 2队的球员D

有谁知道如何做到这一点?

真实数据包含数千支球队和数百万玩家。

回答

5

你可以试试这个:

size <- nrow(df) 
diag(-1, size, size) + df$players 

#  [,1] [,2] [,3] [,4] 
#[1,] 4 5 5 5 
#[2,] 2 1 2 2 
#[3,] 1 1 0 1 
#[4,] 2 2 2 1 

要设置尺寸名称:

with(df, { 
    size <- length(teams) 
    m <- diag(-1, size, size) + players 
    dimnames(m) <- list(teams, teams) 
    m 
}) 

# A B C D 
#A 4 5 5 5 
#B 2 1 2 2 
#C 1 1 0 1 
#D 2 2 2 1