我有同时为不同大学工作的不同人的原始数据,例如:
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 ....),转换不成功。请帮忙。
答案 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)