R中的排序问题

问题

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

解决

向量

  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

列表

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

  1. # 生成一个列表
  2. df <- data.frame (id=1:4,
  3. weight=c(20,27,24,22),
  4. size=c("small", "large", "medium", "large"))
  5. df
  6. library(plyr)
  7. # "weight"列排序,他们有相同的结果.
  8. arrange(df, weight) # 使用plyr包里的arrange函数
  9. df[ order(df$weight), ] # 使用R内置的功能
  10. #> id weight size
  11. #> 1 1 20 small
  12. #> 2 4 22 large
  13. #> 3 3 24 medium
  14. #> 4 2 27 large
  15. # 以size为第一关键词, weight为第二关键词排序
  16. arrange(df, size, weight) # 使用plyr包里的arrange函数
  17. df[ order(df$size, df$weight), ] # 使用R内置的功能
  18. #> id weight size
  19. #> 4 4 22 large
  20. #> 2 2 27 large
  21. #> 3 3 24 medium
  22. #> 1 1 20 small
  23. # 所有列从左到右排序
  24. df[ do.call(order, as.list(df)), ]
  25. # 在这个特殊的例子中,顺序将保持不变

请注意,size列是一个把行排序的因子。在这种情况下,横向将自动按字母顺序排列(创建数据表格),所以是第一和是最后。

反向排序

使用decreasing=TRUE可以反向排序。

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

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

原文链接:http://www.cookbook-r.com/Manipulating_data/Sorting/