繁体   English   中英

根据度数对节点进行排序,并使用igraph在R中进行操作

[英]Sorting nodes according to degree and manipulating in R using igraph

我正在使用的数据集显示节点之间的链接。例如:

> 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

我的目标是用dSorted中的节点相应的顺序替换ln1中的节点。例如,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.很新。如果有人在这里向我展示一条道路,我真的很感激。

如果我理解正确,你可以这样做:

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,因为它是第47个中的第3个值为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 ,使其类似于原始订单。 用文字混淆,但玩弄它,你会看到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM