r-将具有3列的数据帧转换为加权邻接矩阵



我试图在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 

(实际上是更多的名称和值(

我想要矩阵的两个轴上的人的名字,像这样:

TiffanyKenneth>戈登<1>79>270
琥珀James
琥珀色05
Tiffany5046
James
Kenneth7630
Gordon962

带有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

最新更新