6.8 重命名因子水平

6.8.1 问题

你想要重命名因子水平。

6.8.2 方案

  1. # 处理一个因子的样例
  2. x <- factor(c("alpha", "beta", "gamma", "alpha", "beta"))
  3. x
  4. #> [1] alpha beta gamma alpha beta
  5. #> Levels: alpha beta gamma
  6. levels(x)
  7. #> [1] "alpha" "beta" "gamma"

最简单的办法是使用 plyr 包中的 revalue()或者 mapvalues() 函数。

  1. library(plyr)
  2. revalue(x, c(beta = "two", gamma = "three"))
  3. #> [1] alpha two three alpha two
  4. #> Levels: alpha two three
  5. mapvalues(x, from = c("beta", "gamma"), to = c("two", "three"))
  6. #> [1] alpha two three alpha two
  7. #> Levels: alpha two three

如果你不想要依赖 plyr 包,你可以使用 R 的内置函数进行以下处理。注意这些方法会直接修改变量x;你不需要将结果重新赋值回给x

  1. # 通过名字重命名: change 'beta' to 'two'
  2. levels(x)[levels(x) == "beta"] <- "two"
  3. # 你也可以通过位置重命名,但这种做法比较危险(会因数据变化造成不可控结果),不值得推荐
  4. # 通过因子列表索引重命名: change third item, 'gamma', to
  5. # 'three'.
  6. levels(x)[3] <- "three"
  7. x
  8. #> [1] alpha two three alpha two
  9. #> Levels: alpha two three
  10. # 重命名所有的因子水平
  11. levels(x) <- c("one", "two", "three")
  12. x
  13. #> [1] one two three one two
  14. #> Levels: one two three

我们可以不使用 plyr 包而通过名字实现因子水平的重命名,但记住这只有在所有的水平都在列表中时才起作用,否则会返回 NA 以代替寻找不到的因子水平。

  1. # 用名字重命名所有因子
  2. x <- factor(c("alpha", "beta", "gamma", "alpha", "beta"))
  3. levels(x) <- list(A = "alpha", B = "beta", C = "gamma")
  4. x
  5. #> [1] A B C A B
  6. #> Levels: A B C

我们也可以使用 R 的字符串搜索与替换函数去重命名因子水平。注意字符 alpha 周围的 ^$ 符号是用来确保整个字符串能够匹配(正则表达式)。如果没有它们,字符 alphabet 也能够被成功匹配并会被替换为 onbet

  1. # 一个样例
  2. x <- factor(c("alpha", "beta", "gamma", "alpha", "beta"))
  3. x
  4. #> [1] alpha beta gamma alpha beta
  5. #> Levels: alpha beta gamma
  6. levels(x) <- sub("^alpha$", "one", levels(x))
  7. x
  8. #> [1] one beta gamma one beta
  9. #> Levels: one beta gamma
  10. # 将所有的 'a' 替换为 'X'
  11. levels(x) <- gsub("a", "X", levels(x))
  12. x
  13. #> [1] one betX gXmmX one betX
  14. #> Levels: one betX gXmmX
  15. # gsub() 替代所有匹配的元素 sub()
  16. # 只替代每一个元素首先匹配到的内容

6.8.3 更多参考

匹配向量中值并将其替换为新的值操作类似,参见映射向量值获取更多信息。