将数据强制转换为网络分析矩阵R [英] Coercing a Data to a Matrix for network analysis R
本文介绍了将数据强制转换为网络分析矩阵R的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试创建一个无向网络图,作为我正在进行的一个项目的一部分。我所拥有的数据是定性的结果。这里的秩序并不重要。我尝试用iggraph来做这件事--主要是因为这是我几年前学到的,但我不一定喜欢iggraph。
数据如下所示,但有246行:
df <- data.frame(ResultA = c("drug1", "drug2", "drug3", "drug4"),
ResultB = c("drug2", "drug3", "drug4", "drug1"),
ResultC = c("drug4", NA, "drug3", NA),
ResultD = c("drug3", NA, NA, NA))
重要的是,我希望确保所有四列之间都有连接(colname也无关紧要)
因此,第一行将是:
drug1 -- drug2,
drug1 -- drug4,
drug1 -- drug3,
drug2 -- drug4,
drug2 -- drug3,
drug4 -- drug4
我一直试图将其放入邻接/关联矩阵中,但遇到了困难
这里的任何帮助都是很好的-tidyVerse解决方案会很好,但不是必须的(因为我正在努力学习tidyVerse,而不是砍掉我的R)
谢谢!
编辑:
为清楚起见,上面的输出示例是iggraph对象的外观,而不是所需的输出。
对于那些不做SNA的人,这里有一些选择:
To From
drug1 drug2,
drug1 drug4,
drug1 drug3,
drug2 drug4,
drug2 drug3,
drug4 drug4
或邻接矩阵(这里只做第1行和第2行;简称为DR&Q;)
drug1 dr2 dr3 dr4
drug1 0 1 1 1
dr2 1 0 2 1
dr3 1 2 0 1
dr4 1 1 1 0
(我认为,考虑邻接矩阵有点困难,例如:https://www.jessesadler.com/post/network-analysis-with-r/)
推荐答案
我不知道有什么简单/快速的方法可以将数据以这种方式转换为边列表,以便轻松计算邻接矩阵。但以下是使用tidyVerse函数重塑数据的一组步骤。
library(dplyr)
library(tidyr)
library(igraph)
df %>%
mutate(id = row_number()) %>%
pivot_longer(-id) %>%
select(-name) %>%
filter(!is.na(value)) %>%
nest(data=(value)) %>%
mutate(pairs=map(data, ~as_tibble(t(combn(.$value, 2))), .name_repair=T)) %>%
pull(pairs) %>%
bind_rows() %>%
graph_from_data_frame(directed=FALSE) %>%
as_adjacency_matrix()
我们将数据转换为长格式,然后对其进行突变以在每行中创建所有药物对。然后,我们将所有这些对组合在一起,并将其转换为图形对象。然后我们从图形对象中提取邻接矩阵。对于样例输入数据,它返回
4 x 4 sparse Matrix of class "dgCMatrix"
drug1 drug2 drug4 drug3
drug1 . 1 2 1
drug2 1 . 1 2
drug4 2 1 . 3
drug3 1 2 3 1
这篇关于将数据强制转换为网络分析矩阵R的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文