簡體   English   中英

將數據強制轉換為矩陣以進行網絡分析 R

[英]Coercing a Data to a Matrix for network analysis R

我正在嘗試創建一個無向網絡圖作為我正在從事的項目的一部分。 我擁有的數據是定性結果。 在這里訂購沒關系。 我正在嘗試在 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 來破解和削減我的方式)

謝謝!

編輯:

為了清楚起見,上面的 output 示例是 igraph object 的樣子,而不是所需的 output。

對於那些不做 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/

我不知道以這種方式將數據轉換為邊緣列表以輕松計算鄰接矩陣的簡單/快速方法。 但這里有一組使用 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()

我們將數據轉換為長格式,然后對其進行變異以在每一行中創建所有葯物對。 然后我們將所有這些對組合起來,並將其轉換為圖 object。 然后我們從圖 object 中提取鄰接矩陣。 對於樣本輸入數據,這將返回

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM