6.13 对数据框的列重新排序

6.13 对数据框的列重新排序

6.13.1 问题

你想要对一个数据框的列重新排序。

6.13.2 方案

## 一个样例数据框
data <- read.table(header = TRUE, text = "
  id weight   size
   1     20  small
   2     27  large
   3     24 medium
")

## 根据列名数字排序
data[c(1, 3, 2)]
#>   id   size weight
#> 1  1  small     20
#> 2  2  large     27
#> 3  3 medium     24

## 如果你想要实际改变 `data`,需要把它重新赋值回 `data`
## 符号: data <- data[c(1,3,2)]

## 根据列名重新排序
data[c("size", "id", "weight")]
#>     size id weight
#> 1  small  1     20
#> 2  large  2     27
#> 3 medium  3     24

上面例子中对数据框进行索引是将数据框作为一个列表(一个数据框实际上就是向量列表)。你也可以使用矩阵形式的索引方式:

data[, c(1, 3, 2)]
#>   id   size weight
#> 1  1  small     20
#> 2  2  large     27
#> 3  3 medium     24

矩阵形式索引的缺点在于当你只指定一列时结果会不同。下面例子中,返回的结果对象是一个向量 而不是数据框。因为返回的数据类型并不能总是与矩阵索引保持一致,所以通常使用列表形式进行索引更为安全,或者在矩阵索引形式中指定 drop=FALSE 选项:

## 列表形式的索引
data[2]
#>   weight
#> 1     20
#> 2     27
#> 3     24

## 矩阵形式的索引——降维会变为一个向量
data[, 2]
#> [1] 20 27 24

## 矩阵形式的索引,指定 drop=FALSE
## ——保留维度以保存数据框形式
data[, 2, drop = FALSE]
#>   weight
#> 1     20
#> 2     27
#> 3     24