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。我尝试了以下代码:

> 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,因为它在顺序中排名第三 4725 的值为 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 回答