>

예 :

require(igraph)
require(tidygraph)
require(ggraph)
require(data.table)
nodes <- data.table(id = 1:6, 
                    label = c("a1", "b1", "a2", "a3", "b2", "a4"), 
                    type = c("A", "B", "A", "A", "B", "A"))
edges <- data.table(from = c(1, 2, 2, 3, 5),
                    to = c(2, 3, 4, 5, 6))
network <- graph_from_data_frame(d = edges, vertices = nodes, directed = TRUE)
ggraph(network) + 
  geom_edge_link(arrow = arrow(length = unit(4, 'mm')), 
                 start_cap = circle(3, 'mm'), 
                 end_cap = circle(3, 'mm')) + 
  geom_node_point(aes(color = type), size = 7) +
  geom_node_text(aes(label = label)) +
  theme_graph()

이것은 우리가 얻는 것입니다 :

그런 다음 투영을 만듭니다 :

V(network)$type <- bipartite_mapping(network)$type
network_projections <- bipartite_projection(network)
ggraph(network_projections$proj1) + 
  geom_edge_link(arrow = arrow(length = unit(4, 'mm')), 
                 start_cap = circle(3, 'mm'), 
                 end_cap = circle(3, 'mm')) + 
  geom_node_point(size = 7, color = 2, alpha = .6) +
  geom_node_text(aes(label = label)) +
  theme_graph()

이것은 우리가 얻는 것입니다 :

투영은 링크 a2->a3을 보여줍니다. 이는 방향성이 고려되지 않았 음을 의미합니다.

내가 발견 한만큼 igraph 에 의해 계산 된 기본 입사 행렬  라이브러리는 방향성을 고려하지 않은 방식으로 계산됩니다. 이중 부재 네트워크의 방향 투영을 허용하는 기능이 없거나 다른 R 라이브러리가 있습니까?


  • 답변 # 1

    이것은 해결 방법과 같은 최적의 솔루션이 아닙니다.

    (원래 질문의 코드에서 계속)

    # get a list of adjacent vertices from perspective of projections to validate directional connection
    adj_vert <- adjacent_vertices(network_projections$proj1, v = nodes[type == "A", .I])
    # container
    projection_edges <- data.table(from = character(),
                                   to = character())
    for(i in names(adj_vert)){
      # find simplest path, from iterated vertice to vector of shortlisted names
      orig_paths <- all_simple_paths(network, from = as.numeric(i), to = as.numeric(names(adj_vert[[i]])), mode = "out")
      if(length(orig_paths) > 0){
        for(j in 1:length(orig_paths)){
          # for each path, take first and last element to skip "B" nodes in between
          projection_edges <- rbind(projection_edges,
                                    data.table(from = names(orig_paths[[j]])[1],
                                               to = rev(names(orig_paths[[j]]))[1]))
        }
      }
    }
    # corrected projection
    network_projection_corrected <- graph_from_data_frame(d = projection_edges, vertices = nodes[type == "A"], directed = TRUE)
    ggraph(network_projection_corrected) + 
      geom_edge_link(arrow = arrow(length = unit(4, 'mm')), 
                     start_cap = circle(3, 'mm'), 
                     end_cap = circle(3, 'mm')) + 
      geom_node_point(aes(color = type), size = 7) +
      geom_node_text(aes(label = label)) +
      theme_graph()
    
    

    우리는 이것을 얻는다 :

    중첩 된 루프 인 경우에도 끔찍하게 보이지 않습니다. 모든 루프에 대해 인접한 모든 "A"유형 정점이 알려져 있기 때문에 방향 연결을 효과적으로 확인합니다. 하지만 이것이 기본 제공 기능이어야한다고 생각합니다.

    또한 제안 된 접근 방식으로 인해 '실제'네트워크에 발생할 수있는 오류에 대해 잘 모릅니다. 따라서 결코 단단한 것은 아닙니다.

  • 이전 r - Shiny에서 radioButtons를 사용하여 여러 열을 표시 할 수 없습니다
  • 다음 c# - NPOI가 0 바이트 스트림을 생성 중입니다