我试图在R中创建一个矩阵,基于一个有3列的数据帧:第一列是组中人员的名称,第二列也是组中人员名称,第三列是指示人员匹配程度的值:
Person1 Person2 Match
1 Amber Tiffany 5
2 Amber James 1
3 Amber Kenneth 7
4 Amber Gordon 9
5 Tiffany James 4
6 Tiffany Kenneth 6
7 Tiffany Gordon 6
8 James Kenneth 3
9 James Gordon 7
10 Kenneth Gordon 2
etc
(实际上是更多的名称和值(
我想要矩阵的两个轴上的人的名字,像这样:
琥珀 | James | Kenneth>戈登|||
---|---|---|---|---|
琥珀色 | 0 | 5 | <1>79||
Tiffany | 5 | 0 | 4 | >6 |
James | ||||
Kenneth | 7 | 6 | 3 | 0 | 2
Gordon | 9 | 6 | 72 | 0
带有igraph
的选项
get.adjacency(
graph_from_data_frame(df, directed = FALSE),
attr = "Match",
sparse = FALSE
)
给出
Amber Tiffany James Kenneth Gordon
Amber 0 5 1 7 9
Tiffany 5 0 4 6 6
James 1 4 0 3 7
Kenneth 7 6 3 0 2
Gordon 9 6 7 2 0
数据
> dput(df)
structure(list(Person1 = c("Amber", "Amber", "Amber", "Amber",
"Tiffany", "Tiffany", "Tiffany", "James", "James", "Kenneth"),
Person2 = c("Tiffany", "James", "Kenneth", "Gordon", "James",
"Kenneth", "Gordon", "Kenneth", "Gordon", "Gordon"), Match = c(5L,
1L, 7L, 9L, 4L, 6L, 6L, 3L, 7L, 2L)), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6", "7", "8", "9", "10"))
我会首先创建一个空矩阵:
allpersons <- union(df$Person1, df$Person2)
mat <- matrix(0, nrow=length(allpersons), ncol=length(allpersons),
dimnames=list(allpersons, allpersons))
然后按行和列名对将df
第三列的所有值相加:
mat[as.matrix(df[,c(1,2)])] <- df[,3]
mat[as.matrix(df[,c(2,1)])] <- df[,3]
请注意,因为矩阵必须对称,所以值会添加两次:一次用于行-列对,另一次用于列-行对。
结果:
Amber Tiffany James Kenneth Gordon
Amber 0 5 1 7 9
Tiffany 5 0 4 6 6
James 1 4 0 3 7
Kenneth 7 6 3 0 2
Gordon 9 6 7 2 0