问题描述
我有许多不同学校和年级的青少年数据集。我的目标是为所有孩子建立一个邻接矩阵,并为不同学校和年级的学生添加结构零(值= 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
。