我有一些存储在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但我不太了解它们,我不知道要搜索什么这些图书馆具体。
如何使用图形算法获得预期输出,或者您是否考虑过任何其他更简单的解决方案?
答案 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