R-tidyverse系列-forcats处理因子

目前所学知识里,主要需要用到factor因子的地方就是绘图时(例如箱线图)用于调整顺序。forcats提供了一些便捷函数用于调整factor的levels顺序

1、基础函数

  • factor() 将非因子类向量转为因子类向量;
    默认顺序为字符首字母先后顺序,或者数值从小到大顺序。
    可通过levels=参数自定义 因子顺序
  • levels() 用于查看 levels组成、及顺序
test = factor(c("c","b","c"))
test
# [1] c b c
# Levels: b c
levels(test)
# [1] "b" "c"

factor(c("c","b","c"), levels = c("c","b"))
# [1] c b c
# Levels: c b

2、forcats包调整因子顺序

首先forcats包本身提供了关于factor多种多样的处理技巧,这里仅提及学习其中关于因子顺序的相关函数。

2.1 根据向量本身特点修改levels

  • fct_relevel() 自定义更新levels顺序
f <- factor(c("a", "c", "b", "a"),
        levels = c("a", "b", "c"))
fct_relevel(f, c("b", "c", "a"))
# [1] a c b a
# Levels: b c a
  • fct_infreq 根据频率修改levels顺序
f <- factor(c("b", "c", "c", "b","a","b"))
fct_infreq(f)
# [1] b c c b a b
# Levels: b c a
  • fct_inorder()根据出现顺序修改levels顺序
f <- factor(c("b", "c", "c", "a","b","a"))
fct_inorder(f)
# [1] b c c a b a
# Levels: b c a
  • fct_rev() 逆序
f <- factor(c("b", "c", "c", "a","b","a"))
fct_rev(f)
# [1] b c c a b a
# Levels: c b a

2.2 根据向量相关属性(data.frame)指标修改levels

iris示例数据为例

data("iris")

summary(iris)
# Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species  
# Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100   setosa    :50  
# 1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300   versicolor:50  
# Median :5.800   Median :3.000   Median :4.350   Median :1.300   virginica :50  
# Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199                  
# 3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800                  
# Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500        

str(iris)
# 'data.frame': 150 obs. of  5 variables:
#   $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
# $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
# $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
# $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
# $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

levels(iris$Species)
# [1] "setosa"     "versicolor" "virginica"         

fct_reorder()

  • 第一个参数为待修改的factor,第二个参数为相关属性信息,第三个参数为计算方法
  • 例如我想按照每种花的花萼的平均宽度由低到高 设置Species的顺序
fct_reorder(iris$Species, iris$Sepal.Width) %>% levels()
# [1] "versicolor" "virginica"  "setosa"

aggregate(iris$Sepal.Width, by=list(iris$Species), mean)
#     Group.1     x
# 1     setosa 3.428
# 2 versicolor 2.770
# 3  virginica 2.974
  • fct_reorder()默认计算方法为mean均值,默认排序为升序.desc=F。在实际使用使可按需修改
#aggregate(iris$Sepal.Width, by=list(iris$Species), median)
fct_reorder(iris$Species, iris$Sepal.Width, median, .desc=T) %>% levels()
  • 下面以ggplot绘图演示fct_reorder的用法
p1=ggplot(iris, aes(x=Species, y=Sepal.Width)) +
    geom_boxplot() +
    ggtitle("default factor levels")
p2=ggplot(iris, aes(x=fct_reorder(Species, Sepal.Width), y=Sepal.Width)) +
    geom_boxplot() +
    ggtitle("fct_reorder default levels")
p3=ggplot(iris, aes(x=fct_reorder(Species, Sepal.Width, .desc=T), y=Sepal.Width)) +
    geom_boxplot() +
    ggtitle("fct_reorder descent levels")
library(patchwork)
p1 | p2 | p3

你可能感兴趣的:(R-tidyverse系列-forcats处理因子)