您好我正在尝试跟踪排序表中某些元素的初始顺序。这是一个小玩具示例:
initialTable=data.frame(
key=runif(30, min=0, max=10000),
category=as.integer(runif(30, min=0, max=3))
)
然后我们按照排序表中键的顺序排列:
lineOrder=order(initialTable$key)
有序的决赛桌:
finalTable=initialTable[lineOrder,]
我们对这些元素感兴趣,并希望在新表中跟踪它们的索引:
listOfIndexOfInterest=which(initialTable$category==1)
所以现在是我严重管理它的方式:
listOfNewPosition=c()
for(i in listOfIndexOfInterest){
listOfNewPosition=c(listOfNewPosition,which(lineOrder==i))
}
最后,目标是为这两个命令提供相同的输出:
initialTable[listOfIndexOfInterest,]
finalTable[listOfNewPosition,]
当然我可以告诉你更多关于它的原因,但为了简单起见,很多大型表以相同的方式排序,我想只建立一个给定顺序中的一些感兴趣的元素列表!
答案 0 :(得分:3)
很好,order(lineOrder)
可用于反转lineOrder
的操作:
identical(initialTable, finalTable[order(lineOrder),])
# [1] TRUE
答案 1 :(得分:1)
只需将初始订单存储为新列。然后,您可以根据需要在原始索引上match
。
set.seed(1)
initialTable=data.frame(
key=runif(30, min=0, max=10000),
category=as.integer(runif(30, min=0, max=3))
)
initialTable$initialOrder <- seq_len(nrow(initialTable))
finalTable <- initialTable[order(initialTable$key),]
listOfIndexOfInterest=which(initialTable$category==1)
finalTable[match(listOfIndexOfInterest,finalTable$initialOrder),]
答案 2 :(得分:0)
很抱歉,但是询问有时是健康的,这是我的回答:
listOfNewPosition=order(lineOrder)[listOfIndexOfInterest]
重新排序有序位置完成工作......