6.1 排序

6.1 排序

6.1.1 问题

你想将一个向量,矩阵或列表排序。

6.1.2 方案

6.1.2.1 向量

## 生成一个随机向量
v <- sample(101:110)

## 排序
sort(v)
#>  [1] 101 102 103 104 105 106 107 108 109 110

## 反向排序
sort(v, decreasing = TRUE)
#>  [1] 110 109 108 107 106 105 104 103 102 101

6.1.2.2 列表

对列表的一个或多个列进行排序,可以使用 plyr 包里的 arrange() 函数或者使用 R 的内置函数。arrange() 函数更容易使用,但需要额外安装包。

## 生成一个列表
df <- data.frame(id = 1:4, weight = c(20, 27, 24, 22), size = c("small",
  "large", "medium", "large"))
df
#>   id weight   size
#> 1  1     20  small
#> 2  2     27  large
#> 3  3     24 medium
#> 4  4     22  large

library(plyr)

## 按照 'weight' 列排序,以下结果相同。
arrange(df, weight)  # 使用 plyr 包里的 arrange 函数
#>   id weight   size
#> 1  1     20  small
#> 2  4     22  large
#> 3  3     24 medium
#> 4  2     27  large
df[order(df$weight), ]  # 使用 R 内置函数
#>   id weight   size
#> 1  1     20  small
#> 4  4     22  large
#> 3  3     24 medium
#> 2  2     27  large

## 以 size 为第一关键词, weight 为第二关键词排序
arrange(df, size, weight)  # 使用 plyr 包里的 arrange 函数
#>   id weight   size
#> 1  4     22  large
#> 2  2     27  large
#> 3  3     24 medium
#> 4  1     20  small
df[order(df$size, df$weight), ]  # 使用 R 内置函数
#>   id weight   size
#> 4  4     22  large
#> 2  2     27  large
#> 3  3     24 medium
#> 1  1     20  small

## 所有列从左到右依次排序
df[do.call(order, as.list(df)), ]
#>   id weight   size
#> 1  1     20  small
#> 2  2     27  large
#> 3  3     24 medium
#> 4  4     22  large
## 在这个特殊的例子中,顺序将保持不变

请注意,size 列是一个因子且按照因子水平进行排序。在这种情况下将自动按字母顺序排列(创建数据表格),所以大 是第一而小 是最后。

6.1.2.2.1 反向排序

设定 decreasing=TRUE 可以获取反向排序结果。

反向排序某一列的方法依赖于数据类型:

  • 数字:变量名前加一个-。例如:df[order(-df$weight)]
  • 因子:转换为整数,变量名前加一个-。例如:df[order(-xtfrm(df$size)), ]
  • 字符:没有简单的方法能做到这一点。一种方法是先转换为一个因子,然后如上所述。
## 反向排序 weight 列,下面方法有相同结果:
arrange(df, -weight)  # 使用 plyr 包里的 arrange 函数
#>   id weight   size
#> 1  2     27  large
#> 2  3     24 medium
#> 3  4     22  large
#> 4  1     20  small
df[order(df$weight, decreasing = TRUE), ]  # 使用 R 内置函数
#>   id weight   size
#> 2  2     27  large
#> 3  3     24 medium
#> 4  4     22  large
#> 1  1     20  small
df[order(-df$weight), ]  # 使用 R 内置函数
#>   id weight   size
#> 2  2     27  large
#> 3  3     24 medium
#> 4  4     22  large
#> 1  1     20  small

## 升序排列 size ,然后降序排列 weight
arrange(df, size, -weight)  # 使用 plyr 包里的 arrange 函数
#>   id weight   size
#> 1  2     27  large
#> 2  4     22  large
#> 3  3     24 medium
#> 4  1     20  small
df[order(df$size, -df$weight), ]  # 使用 R 内置函数
#>   id weight   size
#> 2  2     27  large
#> 4  4     22  large
#> 3  3     24 medium
#> 1  1     20  small

## 升序排列 size,然后降序排列 weight 因子需要 xtfrm()
arrange(df, -xtfrm(size), weight)  # 使用 plyr 包里的 arrange 函数
#>   id weight   size
#> 1  1     20  small
#> 2  3     24 medium
#> 3  4     22  large
#> 4  2     27  large
df[order(-xtfrm(df$size), df$weight), ]  # 使用 R 内置函数
#>   id weight   size
#> 1  1     20  small
#> 3  3     24 medium
#> 4  4     22  large
#> 2  2     27  large