将数据强制转换为网络分析矩阵R [英] Coercing a Data to a Matrix for network analysis R

查看:6
本文介绍了将数据强制转换为网络分析矩阵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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆