如何在 R 中对 'paired' 个向量进行排序

How to sort 'paired' vectors in R

假设我有两个长度相同的独立向量``xandy`:

   x         y
   1         0.12
   2         0.50
   3         0.07
   4         0.10
   5         0.02

我想按降序对 y 中的元素进行排序,并以一种允许我保持两个向量之间对应关系的方式对 x 中的值进行排序,这将导致这个:

   x         y
   2         0.50
   1         0.12
   4         0.10
   3         0.07
   5         0.02

我是 r 的新手,虽然我知道它有一个内置的 sort 函数可以让我对 y 中的元素进行排序,但我不知道如何让它对两者都进行排序。我唯一能想到的就是通过检查 y:

中元素的原始位置来执行 for 循环以“手动”排序 x
for(i in 1:length(ysorted)){
    xsorted[i]=x[which(ysorted[i]==y)]
}

这是非常无效的。

我们可以在base R

中使用order
df2 <- df1[order(-df1$y),]

-输出

df2
  x    y
2 2 0.50
1 1 0.12
4 4 0.10
3 3 0.07
5 5 0.02

数据

df1 <- structure(list(x = 1:5, y = c(0.12, 0.5, 0.07, 0.1, 0.02)), 
class = "data.frame", row.names = c(NA, 
-5L))

dplyr中:

dat <- structure(list(x = 1:5, 
y = c(0.12, 0.5, 0.07, 0.1, 0.02)), 
class = "data.frame", row.names = c(NA, 
-5L))

library(dplyr)
dat %>% arrange(desc(y))
  x    y
1 2 0.50
2 1 0.12
3 4 0.10
4 3 0.07
5 5 0.02

data.table中:

library(data.table)
as.data.table(dat)[order(-y)]
   x    y
1: 2 0.50
2: 1 0.12
3: 4 0.10
4: 3 0.07
5: 5 0.02

速度比较

答案中已经给出了三种解法,即:basedplyrdata.table。与这种情况类似,在R编程中的很多情况下,您可以通过不同的方法获得完全相同的结果。

如果您需要根据每个方法在 R 中的执行速度来比较这些方法,您可以使用 {microbenchmark} 包中的 microbenchmark(同样,还有一些其他的方法来做到这一点)。 这是一个例子。在这个例子中,每个方法都是 运行 1000 次,然后报告所需时间的摘要。

microbenchmark(
     base_order = dat[order(-dat$y),],
     dplyr_order = dat %>% arrange(desc(y)),
     dt_order = as.data.table(dat)[order(-y)], 
     times = 1000
 )

#Unit: microseconds
#        expr    min      lq      mean  median      uq     max neval
#  base_order   42.0   63.25   97.2585   79.45  100.35  6761.8  1000
# dplyr_order 1244.5 1503.45 1996.4406 1689.85 2065.30 16868.4  1000
#    dt_order  261.3  395.85  583.9086  487.35  587.70 39294.6  1000

结果表明,对于您的情况,base_order 是最快的。它执行列排序的速度比 dplyr_order 快约 20 倍,比 dt_order 快约 6 倍。