R排序保持跟踪

时间:2016-03-02 16:12:04

标签: r sorting match

您好我正在尝试跟踪排序表中某些元素的初始顺序。这是一个小玩具示例:

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,]

当然我可以告诉你更多关于它的原因,但为了简单起见,很多大型表以相同的方式排序,我想只建立一个给定顺序中的一些感兴趣的元素列表!

3 个答案:

答案 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]

重新排序有序位置完成工作......