【问题标题】:Coercing a Data to a Matrix for network analysis R将数据强制转换为矩阵以进行网络分析 R
【发布时间】:2023-03-17 15:03:01
【问题描述】:

我正在尝试创建一个无向网络图,作为我正在进行的项目的一部分。我拥有的数据是定性结果。在这里订购没关系。我正在尝试在 igraph 中做到这一点 - 主要是因为这是我几年前学到的,但我不一定会依附于 igraph。

数据看起来像这样,但有 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)) 

重要的是,我想确保所有四列之间都有连接(列名也无关紧要)

所以第一行应该是:

drug1 -- drug2,  
drug1 -- drug4,
drug1 -- drug3, 
drug2 -- drug4, 
drug2 -- drug3,
drug4 -- drug4

我一直在尝试将其纳入邻接/发生矩阵,但很困难

这里的任何帮助都会很棒 - tidyverse 解决方案会很好,但不是必需的(因为我正在努力学习 tidyverse,而不是通过 R 来破解和削减我的方式)

谢谢!

编辑:

为了清楚起见,上面的输出示例是 igraph 对象的样子,而不是所需的输出。

对于那些不做 SNA 的人,这里有以下选项:

To    From
drug1 drug2,  
drug1 drug4,
drug1 drug3, 
drug2 drug4, 
drug2 drug3,
drug4 drug4

或邻接矩阵(这里只做第 1 行和第 2 行;简称为“dr”)

     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/

【问题讨论】:

    标签: r igraph


    【解决方案1】:

    我不知道以这种方式将数据转换为边缘列表以轻松计算邻接矩阵的简单/快速方法。但这里有一组使用 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
    
    

    【讨论】:

    • 我已将此标记为已解决。在 df 的块中运行代码后,我发现数据中的某处似乎存在特定错误 - 我将为此打开一个新 q - 但否则此方法有效
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多