假设我有以下数据:
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队的球员可以参加:
有谁知道怎么做?
真正的数据包含数千个团队和数百万玩家。
答案 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