5

私が使用しているデータセットは、ノード間のリンクを示しています。例:

> data2
   V1   V2
1 10000 4725
2  4725 6805
3  4725 3250
4  5725 3250
5  1725 7673

(たとえば、小さなデータフレームを使用します)。ここで、データフレームは、ノード 10000 と 4725 の間に無向リンクがあること、ノード 4725 と 6805 の間にリンクが存在することなどを示しています。igraph パ​​ッケージを使用して、個々のノードの次数を取得しています。

  g<-graph.data.frame(data2, directed=F)
 deg <- igraph::degree(g)
> deg
   10000  4725  5725  1725  6805  3250  7673 
    1     3     1     1     1     2     1 

次に、次数に従ってノードを降順に並べ替えます。

 > dSorted <-sort.int(deg,decreasing=TRUE,index.return=FALSE)
 > dSorted
 4725  3250 10000  5725  1725  6805  7673 
   3     2     1     1     1     1     1

データフレームの最初の列を取得します。

  > ln1 <- data2[,1]
> ln1
[1] 10000  4725  4725  5725  1725

私の目的は、ln1 のノードを dSorted のノードの対応する順序に置き換えることです。たとえば、10000 は 3 に置き換える必要があります。これは、dSorted では 10000 が 3 番目のインデックスになるためです。同様に、4725 は最初に来るため、1 に置き換える必要があります。 dSorted.I は次のコードを試しました。

> for(i in 1:length(deg)){ln1[which(ln1==dSorted[i])]<-i}

しかし、それは機能していません.ln1は同じままです.dSortedでは、ノード番号がインデックスと見なされていることに気づきました.そのため、次のコードも試しました(dSortedはインデックスベクトルを返します):

> dSorted <- sort.int(deg,decreasing=TRUE,index.return=TRUE)
> for(i in 1:length(deg)){ln1[which(ln1==dSorted$ix[i])]<-i}

しかし、ln1 はまだ同じままです。私は R に非常に慣れていません。

4

1 に答える 1

1

私があなたを正しく理解していれば、次のことができます:

ln1 <- order(order(deg, decreasing=T))
# [1] 3 1 4 5 6 2 7

# if you want names
names(ln1) <- names(deg)
# 10000  4725  5725  1725  6805  3250  7673 
#     3     1     4     5     6     2     7

前述のように、10000 は順序で 3 番目であるため値 3 を持ち、4725 は順序で 1 番目であるため値 1 を持ちます。

sortorderが関連している方法:sortデフォルトでは、ベクトルをソートし、ベクトルをソートするインデックスorderを返します。

なぜ二重order?それらは互いに逆のようなものです。

sorted <- sort(deg)
deg[order(deg)] == sorted
sorted[order(order(deg))] == deg

order(deg)ソートされ ていないものを順番に並べますdeg元の順序に似るように並べ替えorder(order(deg))られます。ややこしい言葉ですが、いじってみるとわかります。 deg

于 2015-07-17T05:22:11.180 に答える