【问题标题】:Recode adjacency matrix cells based on conditions from data frame根据数据帧中的条件重新编码邻接矩阵单元
【发布时间】:2020-12-11 09:05:16
【问题描述】:

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

【问题讨论】:

    标签: r for-loop matrix conditional-statements apply


    【解决方案1】:

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

    ## 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

    【讨论】:

    • 我收到此错误:*tmp*[pid, ] 中的错误:下标越界
    • 啊,我认为发生的事情是 dim(d)[1] 调用行号,但我正在使用的真实数据集中的行号是非连续的。例如,我有 1497 个观察值,但实际行名范围为 22-8821
    • 是的,我也很怀疑。这就是为什么使用每行的 id (d$id[i]) 而不是实际行号的原因。但是,如果您没有在矩阵中包含所有 id,那就行不通了。您还可以遍历矩阵的rownames 并使用它们从data.frame 中获取学校和年级。
    • 将 id# 转换为行名,然后使用它!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    相关资源
    最近更新 更多