r - 使用计数数据填充矩阵

wak*_*ake 2 r matrix dataframe

假设我有以下数据:

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
Run Code Online (Sandbox Code Playgroud)

我想填充一个加权的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
Run Code Online (Sandbox Code Playgroud)

请注意,A队的球员可以玩:

  • 来自A队的其他4名球员
  • 来自B队的2名球员
  • 来自C队的1名球员
  • 来自D队的2名球员

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

真实数据包含数千个团队和数百万玩家.

Psi*_*dom 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
Run Code Online (Sandbox Code Playgroud)

要设置维度名称:

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
Run Code Online (Sandbox Code Playgroud)