6.1 排序

6.1.1 问题

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

6.1.2 方案

6.1.2.1 向量

  1. # 生成一个随机向量
  2. v <- sample(101:110)
  3. # 排序
  4. sort(v)
  5. #> [1] 101 102 103 104 105 106 107 108 109 110
  6. # 反向排序
  7. sort(v, decreasing = TRUE)
  8. #> [1] 110 109 108 107 106 105 104 103 102 101

6.1.2.2 列表

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

  1. # 生成一个列表
  2. df <- data.frame(id = 1:4, weight = c(20, 27, 24, 22), size = c("small",
  3. "large", "medium", "large"))
  4. df
  5. #> id weight size
  6. #> 1 1 20 small
  7. #> 2 2 27 large
  8. #> 3 3 24 medium
  9. #> 4 4 22 large
  10. library(plyr)
  11. # 按照 'weight' 列排序,以下结果相同。
  12. arrange(df, weight) # 使用 plyr 包里的 arrange 函数
  13. #> id weight size
  14. #> 1 1 20 small
  15. #> 2 4 22 large
  16. #> 3 3 24 medium
  17. #> 4 2 27 large
  18. df[order(df$weight), ] # 使用 R 内置函数
  19. #> id weight size
  20. #> 1 1 20 small
  21. #> 4 4 22 large
  22. #> 3 3 24 medium
  23. #> 2 2 27 large
  24. # 以 size 为第一关键词, weight 为第二关键词排序
  25. arrange(df, size, weight) # 使用 plyr 包里的 arrange 函数
  26. #> id weight size
  27. #> 1 4 22 large
  28. #> 2 2 27 large
  29. #> 3 3 24 medium
  30. #> 4 1 20 small
  31. df[order(df$size, df$weight), ] # 使用 R 内置函数
  32. #> id weight size
  33. #> 4 4 22 large
  34. #> 2 2 27 large
  35. #> 3 3 24 medium
  36. #> 1 1 20 small
  37. # 所有列从左到右依次排序
  38. df[do.call(order, as.list(df)), ]
  39. #> id weight size
  40. #> 1 1 20 small
  41. #> 2 2 27 large
  42. #> 3 3 24 medium
  43. #> 4 4 22 large
  44. # 在这个特殊的例子中,顺序将保持不变

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

6.1.2.2.1 反向排序

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

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

  • 数字:变量名前加一个-。例如:df[order(-df$weight)]
  • 因子:转换为整数,变量名前加一个-。例如:df[order(-xtfrm(df$size)), ]
  • 字符:没有简单的方法能做到这一点。一种方法是先转换为一个因子,然后如上所述。
  1. # 反向排序 weight 列,下面方法有相同结果:
  2. arrange(df, -weight) # 使用 plyr 包里的 arrange 函数
  3. #> id weight size
  4. #> 1 2 27 large
  5. #> 2 3 24 medium
  6. #> 3 4 22 large
  7. #> 4 1 20 small
  8. df[order(df$weight, decreasing = TRUE), ] # 使用 R 内置函数
  9. #> id weight size
  10. #> 2 2 27 large
  11. #> 3 3 24 medium
  12. #> 4 4 22 large
  13. #> 1 1 20 small
  14. df[order(-df$weight), ] # 使用 R 内置函数
  15. #> id weight size
  16. #> 2 2 27 large
  17. #> 3 3 24 medium
  18. #> 4 4 22 large
  19. #> 1 1 20 small
  20. # 升序排列 size ,然后降序排列 weight
  21. arrange(df, size, -weight) # 使用 plyr 包里的 arrange 函数
  22. #> id weight size
  23. #> 1 2 27 large
  24. #> 2 4 22 large
  25. #> 3 3 24 medium
  26. #> 4 1 20 small
  27. df[order(df$size, -df$weight), ] # 使用 R 内置函数
  28. #> id weight size
  29. #> 2 2 27 large
  30. #> 4 4 22 large
  31. #> 3 3 24 medium
  32. #> 1 1 20 small
  33. # 升序排列 size,然后降序排列 weight 因子需要 xtfrm()
  34. arrange(df, -xtfrm(size), weight) # 使用 plyr 包里的 arrange 函数
  35. #> id weight size
  36. #> 1 1 20 small
  37. #> 2 3 24 medium
  38. #> 3 4 22 large
  39. #> 4 2 27 large
  40. df[order(-xtfrm(df$size), df$weight), ] # 使用 R 内置函数
  41. #> id weight size
  42. #> 1 1 20 small
  43. #> 3 3 24 medium
  44. #> 4 4 22 large
  45. #> 2 2 27 large