根据程度对节点进行排序并使用 igraph 在 R 中进行操作
Sorting nodes according to degree and manipulating in R using igraph
我正在使用的数据集在 nodes.For 之间显示 links 示例:
> data2
V1 V2
1 10000 4725
2 4725 6805
3 4725 3250
4 5725 3250
5 1725 7673
(例如使用一个小数据框)。这里的数据框表示节点 10000 和 4725 之间存在无向 link,节点 4725 和 6805 之间存在 link,因此 forth.Using 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
我的objective是将ln1中的节点替换为dSorted.For中节点对应的顺序,例如,10000应该替换为3,因为在dSorted中10000排在第3位index.Similarly 4725 应该换成 1,因为它排在前面 dSorted.I 试过下面的代码:
> for(i in 1:length(deg)){ln1[which(ln1==dSorted[i])]<-i}
但它不起作用。ln1 保持 same.It 我想到在 dSorted 中,节点号被认为是 indexes.So 我也尝试了以下代码(dSorted 返回索引矢量):
> dSorted <- sort.int(deg,decreasing=TRUE,index.return=TRUE)
> for(i in 1:length(deg)){ln1[which(ln1==dSorted$ix[i])]<-i}
但 ln1 仍然保持 same.I 非常新 R.Would 如果有人好心给我指路,我将不胜感激。
如果我理解正确的话,你可以这样做:
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 位,依此类推。
sort
和 order
相关的方式:sort
默认排序向量,order
returns 索引 对向量进行排序。
为什么要双order
?它们是彼此的反面。
sorted <- sort(deg)
deg[order(deg)] == sorted
sorted[order(order(deg))] == deg
order(deg)
将整理您的 未排序 deg
,使其井然有序。
order(order(deg))
将安排您的 sorted deg
使其类似于 original 顺序。言语上很混乱,但玩一玩你就会明白。
我正在使用的数据集在 nodes.For 之间显示 links 示例:
> data2
V1 V2
1 10000 4725
2 4725 6805
3 4725 3250
4 5725 3250
5 1725 7673
(例如使用一个小数据框)。这里的数据框表示节点 10000 和 4725 之间存在无向 link,节点 4725 和 6805 之间存在 link,因此 forth.Using 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
我的objective是将ln1中的节点替换为dSorted.For中节点对应的顺序,例如,10000应该替换为3,因为在dSorted中10000排在第3位index.Similarly 4725 应该换成 1,因为它排在前面 dSorted.I 试过下面的代码:
> for(i in 1:length(deg)){ln1[which(ln1==dSorted[i])]<-i}
但它不起作用。ln1 保持 same.It 我想到在 dSorted 中,节点号被认为是 indexes.So 我也尝试了以下代码(dSorted 返回索引矢量):
> dSorted <- sort.int(deg,decreasing=TRUE,index.return=TRUE)
> for(i in 1:length(deg)){ln1[which(ln1==dSorted$ix[i])]<-i}
但 ln1 仍然保持 same.I 非常新 R.Would 如果有人好心给我指路,我将不胜感激。
如果我理解正确的话,你可以这样做:
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 位,依此类推。
sort
和 order
相关的方式:sort
默认排序向量,order
returns 索引 对向量进行排序。
为什么要双order
?它们是彼此的反面。
sorted <- sort(deg)
deg[order(deg)] == sorted
sorted[order(order(deg))] == deg
order(deg)
将整理您的 未排序 deg
,使其井然有序。
order(order(deg))
将安排您的 sorted deg
使其类似于 original 顺序。言语上很混乱,但玩一玩你就会明白。