如何修改R语言默认行为,让因子按首次出现排序而非字母序?
如何让R中因子默认按首次出现排序而非字母排序?
当然可以!不用每次手动调用fct_inorder(),有两种简单的方法能帮你修改默认行为,适配你偏好的排序方式:
方法1:重写base R的factor()函数
base R里的factor()默认会把因子水平按字母排序,但我们可以重写它,让默认水平变成数据首次出现的顺序。步骤如下:
# 先保存原始的factor函数,方便后续恢复 original_factor <- base::factor # 自定义factor函数,默认用unique(x)(即首次出现顺序)作为水平 factor <- function(x, levels = unique(x), ...) { original_factor(x, levels = levels, ...) }
这样之后,你每次调用factor()或者自动转换因子时,默认就会按数据首次出现的顺序排列水平。如果偶尔需要回到字母排序,直接指定levels = sort(unique(x)),或者调用原始函数base::factor()就行。
方法2:用forcats包替换默认的as.factor()
如果你平时常用forcats包(毕竟你已经在使用fct_inorder()了),可以利用它的as_factor()函数——这个函数默认就是按首次出现顺序生成因子的。把它设为全局默认的因子转换函数,在你的.Rprofile文件里添加以下代码:
# 启动R时自动加载forcats,并替换默认的as.factor if (requireNamespace("forcats", quietly = TRUE)) { assign("as.factor", forcats::as_factor, envir = .GlobalEnv) }
.Rprofile是R的启动配置文件,放在你的用户目录或者项目目录下,每次启动R都会自动执行里面的代码。这样不管是用as.factor()手动转换,还是某些函数自动转换因子时,都会用你想要的首次出现顺序。
小提醒
- 重写base函数可能会和一些依赖默认因子行为的代码冲突,如果是多人协作的项目,最好提前说明这个设置;
- 现在R的默认设置是
stringsAsFactors = FALSE,所以读取数据时字符串不会自动转成因子,你可以手动用上面的factor()或者as.factor()转换,效果会符合预期。
内容的提问来源于stack exchange,提问作者Wassinger
相关产品推荐
相关产品推荐

