【问题标题】:Finding the minimum distances/levels between nodes in a graph like dataframe in R在 R 中的数据框等图形中查找节点之间的最小距离/级别
【发布时间】:2016-07-06 06:00:12
【问题描述】:

我有一些图形数据存储在 data.table 中,描述了一些节点之间的转换,例如:

lfs = data.table( from = c(NA, 'x', 'x', 'y'), to = c('x', 'y', 'p', 'z'), level = 0)
lfs
#  from to level
#:   NA  x     0
#:    x  y     0
#:    x  p     0
#:    y  z     0

我想找到每个节点到起始节点NA的距离。预期结果如下:

#  from to level
#:   NA  x     1
#:    x  y     2
#:    x  p     2
#:    y  z     3

我可以通过如下非常繁琐的方式解决这个问题:

lfs[ is.na(lfs$from) ]$level = 1
target = lfs$from %in% (lfs[ lfs$level == 1 ]$to) 
lfs[target]$level = 2
target = lfs$from %in% (lfs[ lfs$level == 2 ]$to) 
lfs[target]$level = 3

我想应该有更简单和更通用的解决方案,很可能通过在 igraph 等图形库中使用图形操作函数,但我不太了解它们,我不知道具体在这些库中搜索什么。

如何使用图形算法获得预期的输出,或者您是否想到其他更简单的解决方案?

【问题讨论】:

  • 谢谢,这确实解决了问题。你为什么不把它写成答案而不是评论?因此,每个人都可以立即看到它。

标签: r graph dataframe igraph


【解决方案1】:

您可以使用igraph 包计算distances

library(igraph)

lfs = data.frame( from = c('start', 'x', 'x', 'y'), 
                  to = c('x', 'y', 'p', 'z'), 
                  level = 0)

# create graph from data.frame
g <- graph_from_data_frame(lfs)

# find distances from chosen node
distances(g, "start")
#      start x y p z
#start     0 1 2 2 3

【讨论】:

    【解决方案2】:

    如果我们假设from 中的每个唯一值已经存在于to 列的前一行中("start" 除外) - 并且数据按照您描述的方式排序 - 我们可以简单地转换 @将 987654324@ 列转换为数字以达到预期的输出。

    lfs$level <- as.numeric(as.factor(lfs$from))
    > lfs
    #   from to level
    #1 start  x     1  first 'from' value cannot be NA though
    #2     x  y     2
    #3     x  p     2
    #4     y  z     3
    

    【讨论】:

      【解决方案3】:

      我们可以从data.table使用rleid

      library(data.table)
      lfs[, levels := rleid(from)]
      lfs
      #   from to level levels
      #1:   NA  x     0      1
      #2:    x  y     0      2
      #3:    x  p     0      2
      #4:    y  z     0      3
      

      【讨论】:

        猜你喜欢
        • 2011-10-12
        • 1970-01-01
        • 1970-01-01
        • 2013-03-31
        • 1970-01-01
        • 1970-01-01
        • 2014-01-21
        • 2013-12-09
        • 2018-05-25
        相关资源
        最近更新 更多