我想根据患者数据对合并症进行网络分析,以便我可以以图形方式查看哪些疾病是相关的(我在下面将疾病命名为 com1 - com4)。
我有一个像这样的数据结构,其中每种合并症/疾病都用“1”表示。 ID 为 001 的患者患有合并症 com1 和 com2,这应该为我提供 com1 和 com2 之间的联系,而对于患者 002,则没有联系,因为只存在一种疾病,依此类推。因此,一些患者不会为网络做出贡献,而另一些患者则会通过多个连接做出贡献。
我认为可能有专门的函数来实现这一点,或者如果没有,我认为 for 循环可以以某种方式做到这一点。
我有这样的数据:
表1:
id | com1 | com2 | com3 | com4 |
---|---|---|---|---|
001 | 1 | 1 | 0 | 0 |
002 | 0 | 1 | 0 | 0 |
003 | 0 | 0 | 1 | 0 |
004 | 1 | 0 | 1 | 0 |
005 | 1 | 1 | 1 | 0 |
006 | 0 | 0 | 1 | 1 |
我正在寻找类似的东西,以便我在每个连接的新数据框中得到一个新行:
表2:
节点1 | 节点2 |
---|---|
com1 | com2 |
com1 | com3 |
com1 | com2 |
com1 | com2 |
com1 | com3 |
com3 | com4 |
作为第二步,根据表2,我希望能够计算连接/边的数量。请注意,链接中没有方向,即 com1-com2 和 com2-com1 之间没有区别,这就是为什么 com2-com1 不在下表中的原因:
表3:
连接 | n |
---|---|
com1-com2 | 2 |
com1-com3 | 2 |
com1-com4 | 0 |
com2-com3 | 1 |
com2-com4 | 0 |
com3-com4 | 1 |
任何帮助将不胜感激!
亲切的问候, 雅各布
在stackoverflow和其他地方搜索解决方案,没有找到任何
你可以尝试
crossprod
如下
m <- crossprod(as.matrix(df[-1]))
data.frame(
connection = combn(row.names(m), 2, paste0, collapse = "-"),
n = m[lower.tri(m)]
)
这给出了
connection n
1 com1-com2 2
2 com1-com3 2
3 com1-com4 0
4 com2-com3 1
5 com2-com4 0
6 com3-com4 1
df <- read.table(
text = "id com1 com2 com3 com4
001 1 1 0 0
002 0 1 0 0
003 0 0 1 0
004 1 0 1 0
005 1 1 1 0
006 0 0 1 1",
header = TRUE,
check.names = FALSE
)