2016-03-19 69 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 
相關問題