使用列名向量对 data.frame 或 data.table 进行排序

dar*_*ber 1 sorting r dataframe data.table

我有一个data.framedata.table实际上是一个)我需要按多列排序。要排序的列的名称在一个向量中。我该怎么做?例如

DF <- data.frame(A= 5:1, B= 11:15, C= c(3, 3, 2, 2, 1))
DF
  A  B C
  5 11 3
  4 12 3
  3 13 2
  2 14 2
  1 15 1

sortby <- c('C', 'A')

DF[order(sortby),] ## How to do this?
Run Code Online (Sandbox Code Playgroud)

所需的输出如下,但使用sortby向量作为输入。

DF[with(DF, order(C, A)),]
  A  B C
  1 15 1
  2 14 2
  3 13 2
  4 12 3
  5 11 3
Run Code Online (Sandbox Code Playgroud)

( 的解决方案data.table是可取的。)

编辑:如果基本 R 或 data.table 不需要太多编码,我宁愿避免导入其他包。

Jaa*_*aap 5

使用

setorderv(DF, sortby)
Run Code Online (Sandbox Code Playgroud)

这使:

> DF
   A  B C
1: 1 15 1
2: 2 14 2
3: 3 13 2
4: 4 12 3
5: 5 11 3
Run Code Online (Sandbox Code Playgroud)

为了完整起见,使用setorder

setorder(DF, C, A)
Run Code Online (Sandbox Code Playgroud)

使用setorder/的优点setorderv是数据通过引用重新排序,因此非常快速且内存高效。这两个函数都适用于data.table's 和 on data.frame's。


如果要组合升序和降序,可以使用 -order参数setorderv

setorderv(DF, sortby, order = c(1L, -1L))
Run Code Online (Sandbox Code Playgroud)

随后给出:

> DF
   A  B C
1: 1 15 1
2: 3 13 2
3: 2 14 2
4: 5 11 3
5: 4 12 3
Run Code Online (Sandbox Code Playgroud)

setorder您可以通过以下方式实现相同的目标:

setorder(DF, C, -A)
Run Code Online (Sandbox Code Playgroud)