2014-10-14 1 views
0

Я пытаюсь визуализировать предпочтительную сеть продуктов, используя R. У меня уже есть график сети продуктов с использованием igraph, но я хочу посмотреть, что произойдет, если я удалю один продукт , Я обнаружил, что могу удалить узел, используяУдаление одного узла в R

g2 <- g - V(g)[15] 

но он также удалит все ребра, связанные с этим конкретным узлом.

Есть ли способ удалить только узел и посмотреть, как другие узлы повторно соединяются друг с другом после удаления этого одного узла? Любая помощь в этом вопросе приветствуется.

P.S.

Надеемся, что это сделает его более ясным:

Например, если мы генерируем случайный граф:

set.seed(10) 
Data <- data.frame(
    X = sample(1:10), 
    Y = sample(3, 10, replace=T) 
) 
d <- graph.data.frame(Data) 
plot(d) 
d2 <- d-V(d)[2] #deleting '3' from the network 
plot(d2) 

Если вы заметили, при удалении узла «3» от сети, узел " 9 'остается несвязным. Есть ли способ увидеть новый край узла «9» после подключения узла «3»? Все еще следуя тому же сюжету, мы ожидаем, что он соединится с узлом «2». Есть ли функция, которая делает это в igraph? Или я должен сделать код для этого?

+0

Не могли бы вы оставить [ более представительный пример] (http://stackoverflow.com/q uestions/5963269/how-to-make-a-great-r-воспроизводимый пример)? Или, по крайней мере, более четко показать проблему (например, добавив пример с изображениями исходного графика и окончательного нужного графика) – digEmAll

+0

* «как другие узлы снова соединяются друг с другом после удаления этого одного узла» *, как они выглядят предположим, чтобы снова подключиться? – m0nhawk

+0

@digEmAll О, ладно, я положу немного. – basecracker

ответ

1

Может быть, не самый эффективный способ, но он должен работать:

library(igraph) 

set.seed(10) # for plot images reproducibility 

# create a graph 
df <- data.frame(
    X = c('A','A','B','B','D','E'), 
    Y = c('B','C','C','F','B','B') 
) 
d <- graph.data.frame(df) 

# plot the original graph 
plot(d) 

# function to remove the vertex 
removeVertexAndKeepConnections <- function(g,v){ 

    # we does not support multiple vertices 
    stopifnot(length(v) == 1) 

    vert2rem <- V(g)[v] 

    if(is.directed(g) == FALSE){ 
    # get the neigbors of the vertex to remove 
    vx <- as.integer(V(g)[nei(vert2rem)]) 
    # create edges to add before vertex removal 
    newEdges <- as.matrix(unique(expand.grid(vx,vx))) 
    # remove the cycles 
    newEdges <- newEdges[newEdges[,1] != newEdges[,2],] 
    # sort each row index to remove all the duplicates 
    newEdges <- t(apply(newEdges,1,sort)) 
    newEdges <- unique(newEdges) 
    }else{ 
    # get the ingoing/outgoing neigbors of the vertex to remove 
    vx <- as.integer(V(g)[nei(vert2rem,mode='in')]) 
    vy <- as.integer(V(g)[nei(vert2rem,mode='out')]) 
    # create edges to add before vertex removal 
    newEdges <- as.matrix(unique(expand.grid(vx,vy))) 
    } 

    # remove already existing edges 
    newEdges <- newEdges[!apply(newEdges,MARGIN=1,FUN=function(x)are.connected(g,x[1],x[2])),] 

    # add the edges 
    g <- g + edges(as.integer(t(newEdges))) 
    # remove the vertex 
    g <- g - vertex(vert2rem) 

    return(g) 
} 

# let's remove B (you can also use the index 
v <- 'B' 
plot(removeVertexAndKeepConnections(d,v)) 

Оригинал:

enter image description here

Modified:

enter image description here

+0

Отредактировано: добавлена ​​поддержка неориентированных графиков – digEmAll

+0

Удивительно! Это очень помогает! Благодаря! – basecracker

+0

@basecracker: добавлено небольшое исправление ошибок для неориентированных графов – digEmAll

 Смежные вопросы

  • Нет связанных вопросов^_^