如何从R中本质上是非数字的原始数据计算邻接矩阵?

时间:2015-11-24 11:11:09

标签: r social-networking adjacency-matrix

我有同时为不同大学工作的不同人的原始数据,例如:

                UniA  UniB  UniC  UniD
individual_A    X     NA     X     NA
individual_B    NA     X     NA     X
individual_C    NA     X     NA    NA
individual_D    X      X      X    NA

我尝试使用这些数据在大学之间建立加权的非直接网络。换句话说,我想生成一个与下面给出的例子相对应的邻接矩阵:

       UniA UniB UniC UniD
UniA     0    1    2    0
UniB          1    1    1
UniC               0    0 
UniD                    0

如何在R中实现这一点。任何提示或指示都将非常受欢迎。

提前感谢您的时间和帮助。

编辑:你能帮助重塑数据

              position1   position2  position3 position4
individual_A   UniA        UniC          NA       NA
individual_B   UniB        UniD          NA       NA
individual_C   UniB        NA            NA       NA
individual_D   UniA        UniB          UniC     NA

我尝试使用包reshape melt()和cast()将数据转换为我之前显示的表单:

                UniA  UniB  UniC  UniD
individual_A    X     NA     X     NA
individual_B    NA     X     NA     X
individual_C    NA     X     NA    NA
individual_D    X      X      X    NA

但是,原始数据中的值实际上是字符串(uniA / uniB ....),转换不成功。请帮忙。

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案,假设UniB对角线值为零,而不是一个。

数据

dat = read.table(header=T, text="                UniA  UniB  UniC  UniD
individual_A    X     NA     X     NA
individual_B    NA     X     NA     X
individual_C    NA     X     NA    NA
individual_D    X      X      X    NA")

计算

out <- crossprod(!is.na(dat))
diag(out) <- 0

如果您希望下三角形为零

out[lower.tri(out)] <- 0

解释

!is.na(dat)创建一个逻辑矩阵,描述数据是否丢失(在内部,这相当于零和1)。然后计算叉积。您可以使用assign diag(dat) <-覆盖对角线值。

好的,重新评论,似乎有两个进程用于填充邻接矩阵。 1)非对角线记录参加每对大学的个人数量2)对角线被标记为非零,如果它是个人参加的唯一大学(尽管多个人可以参加)。我假设所需的价值是将其作为唯一出席人数的个人数量。

所以关注之前

d <- !is.na(dat)
out <- crossprod(d)
diag(out) <- 0

id <- rowSums(d)==1 # which individuals only attend one uni
mx <- max.col(d, "first")  # if there is only one attended which uni?
tab <- table(mx[id])
diag(out)[as.numeric(names(tab))] <- tab
out
#     UniA UniB UniC UniD
#UniA    0    1    2    0
#UniB    1    1    1    1
#UniC    2    1    0    0
#UniD    0    1    0    0

重塑数据

library(reshape2) 
dat$id <- rownames(dat) 
m <- melt(dat, id="id", na.rm=TRUE)[-2] 
 table(m)