6.11 重命名数据框的列

6.11.1 问题

你想要给数据框的列重新命名。

6.11.2 方案

让我们从有三列的一个数据框开始:

  1. d <- data.frame(alpha = 1:3, beta = 4:6, gamma = 7:9)
  2. d
  3. #> alpha beta gamma
  4. #> 1 1 4 7
  5. #> 2 2 5 8
  6. #> 3 3 6 9
  7. names(d)
  8. #> [1] "alpha" "beta" "gamma"

最简单的方式是使用 plyr 包的 rename() 函数:

  1. library(plyr)
  2. rename(d, c(beta = "two", gamma = "three"))
  3. #> alpha two three
  4. #> 1 1 4 7
  5. #> 2 2 5 8
  6. #> 3 3 6 9

如果你不想要依赖 plyr 包,可以使用下面的 R 内置函数。注意这些直接修改了d,意味着你不需要把结果保存回d

  1. # 通过 name 函数重命名列:把 'beta' 改为 'two'
  2. names(d)[names(d) == "beta"] <- "two"
  3. d
  4. #> alpha two gamma
  5. #> 1 1 4 7
  6. #> 2 2 5 8
  7. #> 3 3 6 9
  8. # 你也可以通过位置索引改变名字,但这种操作会有点危险,一旦你以后对数据做出改变,这些操作可能就不适用了。
  9. # 通过名字向量的位置索引重命名:改变第三项,将 'gamma'
  10. # 改成 'three'
  11. names(d)[3] <- "three"
  12. d
  13. #> alpha two three
  14. #> 1 1 4 7
  15. #> 2 2 5 8
  16. #> 3 3 6 9

也可以使用 R 的字符串搜索和替换函数来重命名列。注意alpha周围的^$是确保全部字符串匹配。没有他们的话,如果存在一个叫 alphabet 的列也会匹配成功。

  1. names(d) <- sub("^alpha$", "one", names(d))
  2. d
  3. #> one two three
  4. #> 1 1 4 7
  5. #> 2 2 5 8
  6. #> 3 3 6 9
  7. # 所有的列中,替换列名中的't'为'X'
  8. names(d) <- gsub("t", "X", names(d))
  9. d
  10. #> one Xwo Xhree
  11. #> 1 1 4 7
  12. #> 2 2 5 8
  13. #> 3 3 6 9
  14. # gsub() 替换每个列名中所有的匹配项 sub()
  15. # 只替换每个列名中匹配的第一项