6.13 对数据框的列重新排序

6.13.1 问题

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

6.13.2 方案

  1. # 一个样例数据框
  2. data <- read.table(header = TRUE, text = "
  3. id weight size
  4. 1 20 small
  5. 2 27 large
  6. 3 24 medium
  7. ")
  8. # 根据列名数字排序
  9. data[c(1, 3, 2)]
  10. #> id size weight
  11. #> 1 1 small 20
  12. #> 2 2 large 27
  13. #> 3 3 medium 24
  14. # 如果你想要实际改变 `data`,需要把它重新赋值回 `data`
  15. # 符号: data <- data[c(1,3,2)]
  16. # 根据列名重新排序
  17. data[c("size", "id", "weight")]
  18. #> size id weight
  19. #> 1 small 1 20
  20. #> 2 large 2 27
  21. #> 3 medium 3 24

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

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

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

  1. # 列表形式的索引
  2. data[2]
  3. #> weight
  4. #> 1 20
  5. #> 2 27
  6. #> 3 24
  7. # 矩阵形式的索引——降维会变为一个向量
  8. data[, 2]
  9. #> [1] 20 27 24
  10. # 矩阵形式的索引,指定 drop=FALSE
  11. # ——保留维度以保存数据框形式
  12. data[, 2, drop = FALSE]
  13. #> weight
  14. #> 1 20
  15. #> 2 27
  16. #> 3 24