我有一个算法,它接收数据,对其进行排序,分析,然后返回排序数据的分数。但是,分数对应于排序数据,我真的想返回与未排序数据相对应的分数。我认为必须有一些默认的R函数来做到这一点,但我找不到任何运气。这是一个MWE,我编写的代码有效,但速度很慢:
orig = rnorm(10)
ord = order(orig)
new = orig[ord]
reprod = sapply(1:length(orig), function(x)new[which(ord==x)] )
all(reprod==orig)
有没有办法更有效地“取消排序”数据?
答案 0 :(得分:1)
只是:
orig = rnorm(100000)
ord = order(orig)
new = orig[ord]
reprod = rep(0,length(new))
reprod[ord] = new
答案 1 :(得分:0)
关于排序向量(order
函数的结果)的一个好处是,如果你对结果运行order
它会给你反向排序,换句话说它会告诉你如何取消排序。以下是我认为您尝试以简单方式做的一个简单示例
> orig <- rnorm(10)
> ord <- order(orig)
> score <- seq_along(orig)
> cbind(orig, score[ order(ord) ])
orig
[1,] -0.2429266384 4
[2,] 0.6346488818 8
[3,] 1.2956779160 9
[4,] -0.5563531517 3
[5,] 1.3299626650 10
[6,] -1.6062497717 1
[7,] -1.1444093167 2
[8,] -0.0004719915 5
[9,] 0.2734227278 7
[10,] 0.0357991850 6
您还可以执行以下操作:
new[ order(ord) ]
看到它将已排序的数据返回到原始订单。