2016-03-19 32 views
3

我有描述一些节点之间的过渡,例如存储在data.table一些图形数据:R中找到的节点之间的最小距离/水平的曲线图像数据帧

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。预期结果如下:

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 

我想应该有更简单,更通用的解决方案,最有可能通过使用图形操作:

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

我可以在一个非常麻烦的方式如下解决这个问题函数在图形库,如igraph,但我不知道他们非常好,我不知道要在这些库中专门搜索什么。

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

+1

谢谢你,这的确解决了这个问题。你为什么不把它写成答案而不是评论?所以,每个人都能立即看到它。 –

回答

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 
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

我们可以使用rleiddata.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 
相关问题