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