Use this if you are using igraph from R
as.directed
converts an undirected graph to directed,
as.undirected
does the opposite, it converts a directed graph to
undirected.
as.directed(graph, mode = c("mutual", "arbitrary")) as.undirected(graph, mode = c("collapse", "each", "mutual"), edge.attr.comb = igraph_opt("edge.attr.comb"))
graph 
The graph to convert. 
mode 
Character constant, defines the conversion algorithm. For

edge.attr.comb 
Specifies what to do with edge attributes, if

Conversion algorithms for as.directed
:
The number of edges in the graph stays the same, an arbitrarily directed edge is created for each undirected edge.
Two directed edges are created for each undirected edge, one in each direction.
Conversion algorithms for as.undirected
:
The number of edges remains constant, an undirected edge is created for each directed one, this version might create graphs with multiple edges.
One undirected edge will be created for each pair of vertices which are connected with at least one directed edge, no multiple edges will be created.
One undirected edge will be created for each pair of mutual edges. Nonmutual edges are ignored. This mode might create multiple edges if there are more than one mutual edge pairs between the same pair of vertices.
A new graph object.
Gabor Csardi csardi.gabor@gmail.com
simplify
for removing multiple and/or loop edges from
a graph.
g < make_ring(10) as.directed(g, "mutual") g2 < make_star(10) as.undirected(g) # Combining edge attributes g3 < make_ring(10, directed=TRUE, mutual=TRUE) E(g3)$weight < seq_len(ecount(g3)) ug3 < as.undirected(g3) print(ug3, e=TRUE) ## Not run: x11(width=10, height=5) layout(rbind(1:2)) plot( g3, layout=layout_in_circle, edge.label=E(g3)$weight) plot(ug3, layout=layout_in_circle, edge.label=E(ug3)$weight) ## End(Not run) g4 < graph(c(1,2, 3,2,3,4,3,4, 5,4,5,4, 6,7, 7,6,7,8,7,8, 8,7,8,9,8,9, 9,8,9,8,9,9, 10,10,10,10)) E(g4)$weight < seq_len(ecount(g4)) ug4 < as.undirected(g4, mode="mutual", edge.attr.comb=list(weight=length)) print(ug4, e=TRUE)