2016-07-28 4 views
1

ノードリストのネットワークネイバーのデータセットを作成しようとしています。私は、私がneighborコマンドを使用するlapply関数でこれを行うことができます。追加の合併症として、私のルックアップノードのいくつかはグラフにはありませんが、それに関係なく動作させることはできません。ここでigraphの近傍をルックアップする機能があります(すべてのノードが見つからない場合)

は一例です。

edgelist <- read.table(text = " 
A B 
B C 
C D 
D E 
C F 
F G") 

testlist <- read.table(text = " 
A 
H 
C 
D 
J") 

testlist2 <- read.table(text = " 
A 
C 
B 
D 
E") 

library(igraph) 
graph <- graph.data.frame(edgelist) 
str(graph) 

neighbors<- lapply(testlist2, function(p) { #Each pledge_id 
    temp=neighbors(graph,p) #Find all the neighbors for that pledge 
    return(temp) 
}) 

neighbors<- lapply(testlist, function(p) { #Each pledge_id 
    temp=neighbors(graph,p) #Find all the neighbors for that pledge 
    return(temp) 
}) 

残念ながら、これは両方のケースでナンセンスを返します。私は何が欠けていますか?

私の所望の出力は、このようなものになるだろう:

lookupnode neighbor 
A B 
H . 
C D 
C F 
D E 
J . 

私はどこかに一時= data.table :: rbindlist(TEMP)コマンドを追加する必要があり、最終的に知っているが、私は思いませんホグウォッシュを引き起こしている。あなたはread.table機能を持つdata.frameを作成し、それを各ベクトルを反復処理だとdata.framelapplyにして渡していることを

答えて

5

一つのことがある、data.frameV1ベクトルの要素ではありません。

第2に、そのV1列が要因(h/tから要素ヒントの場合は@Psidm)です。

第3に、関数は、(私の計算から)反復処理され、name属性が返される必要があるグラフ頂点を返すことになります。あなたが提案するよう

はその後、これらはdata.framerbind EDになる必要があります。

get_neighbors <- function(graph, n) { 

    do.call(rbind, lapply(n, function(x) { 

    if (x %in% V(graph)$name) { 

     nb <- neighbors(graph, x) 

     if (length(nb) > 0) { 
     data.frame(lookupnode=x, 
        neighbor=nb$name, # h/t @MrFlick for this shortcut 
        stringsAsFactors=FALSE) 
     } else { 
     data.frame(lookupnode=x, neighbor=NA, stringsAsFactors=FALSE) 
     } 

    } else { 
     data.frame(lookupnode=x, neighbor=NA, stringsAsFactors=FALSE) 
    } 

    })) 

} 

get_neighbors(graph, as.character(testlist$V1)) 
## lookupnode neighbor 
## 1   A  B 
## 2   H  <NA> 
## 3   C  D 
## 4   C  F 
## 5   D  E 
## 6   J  <NA> 

get_neighbors(graph, as.character(testlist2$V1)) 
## lookupnode neighbor 
## 1   A  B 
## 2   C  D 
## 3   C  F 
## 4   B  C 
## 5   D  E 
## 6   E  <NA> 

ガボールはC側にneighbors()をベクトル化することができた場合、私は疑問に思います。

UPDATE:

egoソリューションは、少し異なります。

get_ego <- function(g, v, n=2) { 
    do.call(rbind, lapply(v, function(x) { 
    if (x %in% V(g)$name) { 
     data.frame(node=x, 
       ego_n=sapply(ego(g, n, x), function(y) { V(g)[y]$name }), 
       stringsAsFactors=FALSE) 
    } else { 
     data.frame(node=x, ego_n=NA, stringsAsFactors=FALSE) 
    } 
    })) 
} 
+1

あなたがこれは素晴らしいです、むしろ 'sapply' – MrFlick

+1

よりもdata.frameの内側'隣人= NB $ NAME'を使用することができます!もちろん、それはデータフレームです。うわー。また、 '%%V(グラフ)$ name'のx%はキーであり、このプロジェクトのどこか別の場所で役に立ちます。ありがとう! – Danielle

+0

これは第1度近傍(これは私が尋ねたものです)と非常にうまく動作しますが、 'ego'関数' ego(graph、2、x) 'で代用すると、クラス" igraph.vs "を持つ1のリストを返します。 (lookupnode = x、neighbor = nb $ name、stringsAsFactors = FALSE): 引数は異なる行数を意味します:1、0 "これをdata.frameに変換することはできません。あなたはその場合どのように修正しますか? – Danielle

関連する問題