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

时间:2017-07-07 21:32:05

标签: 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

我想填充一个加权的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队的球员可以参加:

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

有谁知道怎么做?

真正的数据包含数千个团队和数百万玩家。

1 个答案:

答案 0 :(得分: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