r - 如何从 R 中的 tidygraph 对象列表中操作 tidygraph 对象?

标签 r tidygraph

如果我有一个 tidygraph 对象列表,我想根据某些条件删除列表元素。例如,如果我有一个整洁的图形对象列表,如下所示:

nodes <- data.frame(name = c("Hadley", "David", "Romain", "Julia"))
edges <- data.frame(from = c(1, 1, 1, 2, 3, 3, 4, 4, 4),
                    to = c(2, 3, 4, 1, 1, 2, 1, 2, 3))
nodes_1 <- data.frame(name = c(NA))
edges_1 <- c()

tg <- tbl_graph(nodes = nodes, edges = edges)
tg_1 <- tbl_graph(nodes = nodes_1, edges = edges_1)

myList <- list(tg, tg_1)

查看 myList 的输出我们可以看到 tidygraph 对象之一没有与之关联的边,并且 names列是 NA .

> myList
[[1]]
# A tbl_graph: 4 nodes and 9 edges
#
# A directed simple graph with 1 component
#
# Node Data: 4 × 1 (active)
  name  
  <chr> 
1 Hadley
2 David 
3 Romain
4 Julia 
#
# Edge Data: 9 × 2
   from    to
  <int> <int>
1     1     2
2     1     3
3     1     4
# … with 6 more rows

[[2]]
# A tbl_graph: 1 nodes and 0 edges
#
# A rooted tree
#
# Node Data: 1 × 1 (active)
  name 
  <lgl>
1 NA   
#
# Edge Data: 0 × 2
# … with 2 variables: from <int>, to <int>

我想知道是否有一种方法可以迭代列表并检查是否有任何 tidygraph 对象没有边缘数据或者是 NA (如上面的示例)并从列表中删除该对象。

我知道我可以使用 myList <- myList[-2] 手动删除列表。但当我的列表中有大量 tidygraph 对象时,我一直在寻找更通用的解决方案?

最佳答案

您可以使用 igraph::gsize() 过滤列表,它返回边数:

library(tidygraph)
library(igraph)

Filter(function(x) gsize(x) > 0, myList)  # Filter(gsize, myList) also works but potentially less safe.

# Or

purrr::discard(myList, ~ gsize(.x) == 0)

[[1]]
# A tbl_graph: 4 nodes and 9 edges
#
# A directed simple graph with 1 component
#
# Node Data: 4 x 1 (active)
  name  
  <chr> 
1 Hadley
2 David 
3 Romain
4 Julia 
#
# Edge Data: 9 x 2
   from    to
  <int> <int>
1     1     2
2     1     3
3     1     4
# ... with 6 more rows

关于r - 如何从 R 中的 tidygraph 对象列表中操作 tidygraph 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69111178/

相关文章:

r - 计算 R 中 tidygraph 对象列表中相同列的频率?

r - 向 tidygraph 对象添加属性列

r - ggraph 中的选择性颜色/大小节点

python - 在shinyapps.io 上使用 python 3 in reticulate

r - R 中的直方图和密度

r - 根据每行中列的相对顺序对矩阵中的行进行排序

r - ggplot2 geom_bar 的条形 z 索引

r - ggplot2 中带有边缘直方图的散点图