2016-03-19 6 views
3

におけるデータフレームのようなグラフ内のノード間の最小距離/レベルを見つける:Iのようないくつかのノード間の遷移について説明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 

をIを検索します開始ノードからの各ノードの距離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のようなグラフライブラリでは機能しますが、私はそれらをよく知りませんし、これらのライブラリで何を検索するのか分かりません。

グラフアルゴリズムを使用して期待される出力を得るにはどうすればよいですか、他の簡単な解決策はありますか?我々はfromの各一意の値が既に("start"除く)列toの前の行に存在すると仮定した場合

+1

からrleidを使用することができますありがとう、確かにこれは問題を解決します。コメントの代わりに答えとして書くのはなぜですか?だから、誰もがすぐにそれを見ることができるでしょう。 –

答えて

3

あなたが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

を計算するigraphパッケージを使用することができます - とのデータが順序付けられていますあなたがそれを記述する方法 - 単に期待通りの出力を得るために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

我々は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