代码之家  ›  专栏  ›  技术社区  ›  Jim.W

来自多个列的网络映射?

  •  1
  • Jim.W  · 技术社区  · 8 年前

    我有一个表名列表,希望能够在R中可视化它们的关系

    例如,如果我有一个数据帧:

     Col 1      Col 2     Col 3    Col 4
    
     Table A | Table B | Table C | 
    
     Table Z | Table A | Table C | Table Y
    
     Table K | Table L | Table M | Table B
    
     Table J | Table H | 
    

    我以前使用igraph进行过映射,但我的数据结构不同。只有两列:from&到如果我有多个这样的列,有没有办法绘制图表?我在这方面找不到太多的资源。

    我想画一张地图。这将有从表A到表B和C的行,然后是从表A到表z、表C和表Y的另一行,因为它们是相关的,等等。表J和表H之间只有一个连接。

    http://kateto.net/networks-r-igraph .i图中的网络是我试图模仿的

    2 回复  |  直到 8 年前
        1
  •  0
  •   struggles    8 年前

    你的判决 “那么从表a到的一行” 突然结束,但如果它像 表B和表C” 不幸地 graph_from_adj_list 仅适用于数字列表,因此您只需将数据转换为两列数据框:

    您需要进行一些数据清理。如果数据位于数据框中,则需要使用 三年 group_by nest 函数,然后使用 lapply 函数来迭代新的 数据 包含的列 t 将列转换为行:

    library(igraph)
    library(tidyverse)
    
    
    al_tibble <- tibble(c1 = c('a', 'z', 'k', 'j'),
                        c2 = c('b', 'a', 'l', 'h'),
                        c3 = c('c', 'c', 'h', NA),
                        c4 = c(NA, 'y', 'b', NA))
    
    el <- al %>% 
      group_by(c1) %>%
      nest() %>%
      mutate(data = lapply(data, t)) %>% 
      unnest() %>%
      filter(!is.na(data))
    
    g <- graph_from_data_frame(el)
    

    如果您的数据是在一个列表中组织的,那么您需要遍历每个列表项并从中创建一个数据框架。然后需要使用 bind_rows

    al_list <- list('a' = c('b', 'c'),
                    "z" = c('a', 'c', 'y'),
                    "k" = c('l', 'h', 'b'),
                    "j" = c('h'))
    
    el2 <- lapply(names(al_list), function(x){
      tibble(from = x,
             to = al_list[[x]])
    }) %>%
      bind_rows
    
    g2 <- graph_from_data_frame(el2)
    
        2
  •  0
  •   Jim.W    8 年前

    我在另一篇帖子的帮助下解决了这个问题:

    plot(graph.data.frame(rbindlist(lapply(seq(ncol(test_a2)-1), function(i) test_a2[i:(i+1)]))))
    

    test\u a2只是一个具有多列的数据帧

    在这里,它将绘制前两列,然后移到第二列和第三列,依此类推。

    我希望这能帮助别人!