根据数据帧中的条件重新编码邻接矩阵单元

问题描述

我有许多不同学校和年级的青少年数据集。我的目标是为所有孩子建立一个邻接矩阵,并为不同学校和年级的学生添加结构零(值= 10)(只允许他们提名自己所在学校和年级的朋友)。>

到目前为止,我已经有了邻接矩阵,但是我不确定如何根据顶点属性数据帧中的条件更改像元值。

我在下面有示例数据帧和矩阵。

有DF:

id  school  grade   friendid_1  friendid_2  friendid_3  friendid_4
 1     101      8            2           4          NA          NA
 2     101      8           NA          NA          NA          NA
 3     101      8            1           5           2          NA
 4     101      8            1          NA           2          NA
 5     101      9            1           3          NA          NA
 6     101      9            9           7          NA          NA
 7     101      9            9          10          NA          NA
 8     101      9           NA          10          NA          NA
 9     101      9            6          NA          NA          NA
10     101      9           NA          NA           7          NA
11     102      8           15          NA          NA          NA
12     102      8           11          15          NA          NA
13     102      9           15          12          14          11
14     102      9           13          NA          NA          NA
15     102      9           12          NA          NA          NA
16     103      8           19          NA          NA          17
17     103      8           19          20          NA          NA
18     103      8           17          NA          NA          NA
19     103      8           NA          NA          NA          17
20     103      8           18          17          19          NA

有矩阵:

    1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20
 1  0   1   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
 2  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
 3  1   1   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
 4  1   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
 5  1   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
 6  0   0   0   0   0   0   1   0   1   0   0   0   0   0   0   0   0   0   0   0
 7  0   0   0   0   0   0   0   0   1   1   0   0   0   0   0   0   0   0   0   0
 8  0   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0
 9  0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0
10  0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0
11  0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0
12  0   0   0   0   0   0   0   0   0   0   1   0   0   0   1   0   0   0   0   0
13  0   0   0   0   0   0   0   0   0   0   1   1   0   1   1   0   0   0   0   0
14  0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0
15  0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   0
16  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   1   0
17  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   1
18  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0
19  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0
20  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   1   1   0

旺旺矩阵:

     1  2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20
 1  0   1   0   1   0   10  10  10  10  10  10  10  10  10  10  10  10  10  10  10
 2  0   0   0   0   0   10  10  10  10  10  10  10  10  10  10  10  10  10  10  10
 3  1   1   0   0   1   10  10  10  10  10  10  10  10  10  10  10  10  10  10  10
 4  1   1   0   0   0   10  10  10  10  10  10  10  10  10  10  10  10  10  10  10
 5  1   0   1   0   0   10  10  10  10  10  10  10  10  10  10  10  10  10  10  10
 6  10  10  10  10  10  0   1   0   1   0   10  10  10  10  10  10  10  10  10  10
 7  10  10  10  10  10  0   0   0   1   1   10  10  10  10  10  10  10  10  10  10
 8  10  10  10  10  10  0   0   0   0   1   10  10  10  10  10  10  10  10  10  10
 9  10  10  10  10  10  1   0   0   0   0   10  10  10  10  10  10  10  10  10  10
10  10  10  10  10  10  0   1   0   0   0   10  10  10  10  10  10  10  10  10  10
11  10  10  10  10  10  10  10  10  10  10  0   0   0   0   1   10  10  10  10  10
12  10  10  10  10  10  10  10  10  10  10  1   0   0   0   1   10  10  10  10  10
13  10  10  10  10  10  10  10  10  10  10  1   1   0   1   1   10  10  10  10  10
14  10  10  10  10  10  10  10  10  10  10  0   0   1   0   0   10  10  10  10  10
15  10  10  10  10  10  10  10  10  10  10  0   1   0   0   0   10  10  10  10  10
16  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  0   1   0   1   0
17  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  0   0   0   1   1
18  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  0   1   0   0   0
19  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  0   1   0   0   0
20  10  10  10  10  10  10  10  10  10  10  10  10  10  10  10  0   1   1   1   0

解决方法

您可以遍历所有人,并使用数据集的信息来更改矩阵:

## d is your data.frame,m is your matrix
for(i in 1:dim(d)[1]){
  pid = d$id[i]
  m[pid,][d$grade!=d$grade[i] | d$school!=d$school[i]] = 10
  m[,pid][d$grade!=d$grade[i] | d$school!=d$school[i]] = 10
}

这会将所有不满足行和列属于同一学校和年级的条件的所有单元格设置为10