查找图中节点之间的最小距离/级别,如R中的数据帧

时间:2016-03-19 12:59:14

标签: r graph dataframe igraph

我有一些存储在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但我不太了解它们,我不知道要搜索什么这些图书馆具体。

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

3 个答案:

答案 0 :(得分:3)

您可以使用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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

我们可以使用rleid

中的data.table
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