【问题标题】:How to calculate adjacency matrix from raw data which is non-numeric in nature in R?如何从 R 中本质上非数字的原始数据计算邻接矩阵?
【发布时间】:2015-11-24 11:11:08
【问题描述】:

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

                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....),转换不成功。请帮忙。

【问题讨论】:

  • 你已经尝试过什么了吗?
  • @Heroka 抱歉,不知道。我试图按照link 下的解决方案同时只比较两个列,但它失败了。

标签: r social-networking adjacency-matrix


【解决方案1】:

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

数据

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) 创建一个逻辑矩阵来描述数据是否丢失(在内部这相当于零和一)。然后计算叉积。您可以使用分配diag(dat) &lt;- 覆盖对角线值。


好的,您的 cmets,似乎有两个进程用于填充邻接矩阵。 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)

【讨论】:

  • 感谢您非常有创意的回答!我从来没有想过这样的解决方案,因为我在洛杉矶很糟糕。但对角线值也很关键,因为在我的数据中,有些人只为一所大学工作。对角线值表示这种情况。任何的想法?干杯
  • 不客气。您能否解释一下您是如何在上面的预期结果中得到对角线的……例如,为什么 UniA = 0 & UniB = 1?谢谢[ps。查看crossprod(!is.na(dat)) 的对角线,这给出了每个大学的人数)
  • 我关心的是大学之间的联系。例如individual_B 适用于 UniB 和 UniD ,因此 dat[2,4]=1。但考虑到 individual_C 仅适用于 UniB,它就像 UniB 本身之间的纽带。这就是 dat[2,2] =1 的原因。我所说的对角线值的意思是它显示了人们只为一所大学工作的情况。但无论如何,您的解决方案对我来说非常有用。 90%的工作已经完成!我想问,你怎么知道叉积可以解决问题?背后有网络理论还是我的洛杉矶知识很差? ;-) 欢呼
  • 好的,感谢您提供的信息……然后检查一下;非对角线代表参加这两个大学的人数(这是我们所拥有的),但对角线是一种不同的衡量标准,如果它是一个人参加的唯一大学(即使多人可以参加),否则为零?如果它是唯一有两个人参加的大学,是否应该记录两个? [ps .. 在这里混合这些措施似乎有点令人困惑,因为权重将意味着不同的东西]
  • 我觉得没问题。这是获得预期输出的一些创造性方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多