我正在使用的数据集显示了节点之间的链接。例如:
> 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中首先出现。我尝试了以下代码:
> 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.很新。如果有人在这里给我指路,我真的很感激。
答案 0 :(得分: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,因为它是第47个中的第3个值为1,因为它在顺序中是第1个等。
sort
和order
的关联方式:sort
默认排序您的向量,order
返回对您的向量进行排序的 indices
为什么要加倍 - order
?他们互不相反。
sorted <- sort(deg)
deg[order(deg)] == sorted
sorted[order(order(deg))] == deg
order(deg)
会安排未排序 deg
,以便按顺序排列。
order(order(deg))
会安排已排序 deg
,因此它类似于原始订单。用文字混淆,但玩弄它,你会看到。