【问题标题】:R sorting keeping trackR排序跟踪
【发布时间】:2016-03-03 03:02:15
【问题描述】:

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

initialTable=data.frame(
  key=runif(30, min=0, max=10000),
  category=as.integer(runif(30, min=0, max=3))
)

然后我们根据key在排好序的表中得到行的顺序:

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

当然我可以告诉你更多关于原因的信息,但为了简单起见,很多大表都以相同的方式排序,我只想按给定的顺序构建一次感兴趣的元素列表!

【问题讨论】:

    标签: r sorting match


    【解决方案1】:

    很好,order(lineOrder) 可以用来反转lineOrder 的动作:

    identical(initialTable, finalTable[order(lineOrder),])
    # [1] TRUE
    

    【讨论】:

      【解决方案2】:

      只需将初始订单存储为新列。然后您可以根据需要在原始索引上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),]
      

      【讨论】:

        【解决方案3】:

        很抱歉,有时询问是有益的,这是我的回答:

        listOfNewPosition=order(lineOrder)[listOfIndexOfInterest]
        

        重新排序排序的位置做这项工作......

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-08-23
          • 1970-01-01
          • 2010-12-07
          • 1970-01-01
          相关资源
          最近更新 更多