6.8 重命名因子水平

6.8 重命名因子水平

6.8.1 问题

你想要重命名因子水平。

6.8.2 方案

## 处理一个因子的样例
x <- factor(c("alpha", "beta", "gamma", "alpha", "beta"))
x
#> [1] alpha beta  gamma alpha beta
#> Levels: alpha beta gamma

levels(x)
#> [1] "alpha" "beta"  "gamma"

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

library(plyr)
revalue(x, c(beta = "two", gamma = "three"))
#> [1] alpha two   three alpha two
#> Levels: alpha two three

mapvalues(x, from = c("beta", "gamma"), to = c("two", "three"))
#> [1] alpha two   three alpha two
#> Levels: alpha two three

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

## 通过名字重命名: change 'beta' to 'two'
levels(x)[levels(x) == "beta"] <- "two"

## 你也可以通过位置重命名,但这种做法比较危险(会因数据变化造成不可控结果),不值得推荐

## 通过因子列表索引重命名: change third item, 'gamma', to
## 'three'.
levels(x)[3] <- "three"
x
#> [1] alpha two   three alpha two
#> Levels: alpha two three

## 重命名所有的因子水平
levels(x) <- c("one", "two", "three")
x
#> [1] one   two   three one   two
#> Levels: one two three

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

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

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

## 一个样例
x <- factor(c("alpha", "beta", "gamma", "alpha", "beta"))
x
#> [1] alpha beta  gamma alpha beta
#> Levels: alpha beta gamma

levels(x) <- sub("^alpha$", "one", levels(x))
x
#> [1] one   beta  gamma one   beta
#> Levels: one beta gamma

## 将所有的 'a' 替换为 'X'
levels(x) <- gsub("a", "X", levels(x))
x
#> [1] one   betX  gXmmX one   betX
#> Levels: one betX gXmmX

## gsub() 替代所有匹配的元素 sub()
## 只替代每一个元素首先匹配到的内容

6.8.3 更多参考

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