如何在 R 中对 'paired' 个向量进行排序
How to sort 'paired' vectors in R
假设我有两个长度相同的独立向量``xand
y`:
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
速度比较
答案中已经给出了三种解法,即:base
、dplyr
、data.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 倍。
假设我有两个长度相同的独立向量``xand
y`:
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
速度比较
答案中已经给出了三种解法,即:base
、dplyr
、data.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 倍。