forcats | tidyverse家族对「分类变量」的解决方案(下)

学堂君根据功能对forcats中的「所有」函数作了汇总,共分为两大类、六小类:

  • 1 针对单个因子变量的处理函数

    • 1.1 增删类别的函数

    • 1.2 归并类别的函数

    • 1.3 重命名类别的函数

    • 1.4 调整类别顺序的函数

    • 1.5 其他函数

  • 2 针对多个因子变量的处理函数

本篇为1.42部分。

library(forcats)
f = factor(c("a", "aa", "b", "bb"),
           levels = c("a", "aa", "aaa", "b", "bb", "bbb"))
f
## [1] a  aa b  bb
## Levels: a aa aaa b bb bbb

1 针对单个因子变量的处理函数

1.4 调整类别顺序的函数

fct_rev()

直接颠倒因子顺序。

fct_rev(f)
## [1] a  aa b  bb
## Levels: bbb bb b aaa aa a
fct_shift()

从某个位置开始(位置索引从0开始),把因子顺序“绕一圈”作为新的顺序。

fct_shift(f, 2)
## [1] a  aa b  bb
## Levels: aaa b bb bbb a aa
fct_relevel()

手动调整顺序,after参数表示调整后的位置(索引从0开始),默认值为0。

fct_relevel(f, "b")
## [1] a  aa b  bb
## Levels: b a aa aaa bb bbb

fct_relevel(f, "b", after = 1)
## [1] a  aa b  bb
## Levels: a b aa aaa bb bbb

## 移动多个类别时,after指第一个需要调整顺序的类别在调整后的位置
fct_relevel(f, "b", "bb", after = 1)
## [1] a  aa b  bb
## Levels: a b bb aa aaa bbb
fct_shuffle()

随机调整顺序;每次运行结果都不一样。

fct_shuffle(f)
## [1] a  aa b  bb
## Levels: a bbb aaa b aa bb

fct_shuffle(f)
## [1] a  aa b  bb
## Levels: a bb bbb b aa aaa
fct_in*()

该系列包含三个函数。它们的功能是使用「统计」的方式来决定新的类别顺序。

f3 <- factor(c("1", "2", "4", "3",
               "1", "1", "2", "4",
               "1", "2", "1", "2"),
             levels = c("1", "3", "2", "4"))
f3
##  [1] 1 2 4 3 1 1 2 4 1 2 1 2
## Levels: 1 3 2 4

按类别第一次出现的先后顺序排序,用fct_inorder()

fct_inorder(f3)
##  [1] 1 2 4 3 1 1 2 4 1 2 1 2
## Levels: 1 2 4 3

按类别出现的次数(即对应的样本量)排序,用fct_infreq()

fct_infreq(f3)
##  [1] 1 2 4 3 1 1 2 4 1 2 1 2
## Levels: 1 2 4 3

若类别使用数字表示(如本例),则可以使用fct_inseq()函数根据数字本来的大小排序:

fct_inseq(f3)
##  [1] 1 2 4 3 1 1 2 4 1 2 1 2
## Levels: 1 2 3 4
fct_reorder()fct_ reorder2()

这两个函数的功能是根据其他变量对因子类别进行重排序,详见推文fct_reorder2函数功能详解及其在可视化中的应用

lvls_reorder()

通过指定新顺序下每个类别所对应的原顺序来调整顺序。

lvls_reorder(f, idx = c(1,4,2,5,3,6))
## [1] a  aa b  bb
## Levels: a b aa bb aaa bbb
  • 例如,idx的第二个元素4表示调整后的第二个类别为原先的第四个类别。

1.5 其他函数

as_factor()

将其他类型的变量转换成因子变量。相当于基础包的as.factor()函数。区别在于该函数转换后的因子类别顺序根据各类别在变量中出现的先后顺序确定;而as.factor()函数根据字母顺序或数字大小确定。

f4 <- c("banana", "2", "1", "apple", "cup", "3")

as.factor(f4)
## [1] banana 2      1      apple  cup    3     
## Levels: 1 2 3 apple banana cup

as_factor(f4)
## [1] banana 2      1      apple  cup    3     
## Levels: banana 2 1 apple cup 3
fct_count()

统计每个类别对应的样本个数和占比。

fct_count(f3) 
## # A tibble: 4 x 2
##   f         n
##   <fct> <int>
## 1 1         5
## 2 3         1
## 3 2         4
## 4 4         2

## 输出结果按个数排序、计算占比
fct_count(f3, sort = T, prop = T) 
## # A tibble: 4 x 3
##   f         n      p
##   <fct> <int>  <dbl>
## 1 1         5 0.417 
## 2 2         4 0.333 
## 3 4         2 0.167 
## 4 3         1 0.0833
fct_unique()

去除变量的重复值,每个重复值仅保留一个。该功能使用基础包的unique()函数也能实现;区别在于该函数输出的变量值按因子类别顺序排序,而unique()函数按变量值出现顺序排序。

不过目前该函数可能有bug。对于没有对应样本的类别,该函数也会将其包含在输出结果里,而unique()函数不会;再者,该函数输出结果中不会含缺失值NA,而后者包含。

f5 <- factor(c("b", "a", NA), levels = c("a", "b", "c"))
f5
## [1] b    a    <NA>
## Levels: a b c

fct_unique(f5)
## [1] a b c
## Levels: a b c

unique(f5)
## [1] b    a    <NA>
## Levels: a b c
fct_explicit_na()

通常来说,因子变量不会把缺失值单独作为一个类别储存在levels中,该函数则可以将缺失值转换成类别。

fct_explicit_na(f5)
## [1] b         a         (Missing)
## Levels: a b c (Missing)

fct_explicit_na(f5, na_level = "NA")
## [1] b  a  NA
## Levels: a b c NA
fct_match()

判断变量中各个元素(或样本)是否属于给定的类别;输出结果为逻辑变量,长度同变量长度。

fct_match(f, lvls = c("a", "b"))
## [1]  TRUE FALSE  TRUE FALSE

2 针对多个因子变量的处理函数

fct_cross()

根据两个以上的分类变量联合确定样本的类别。

f6 <- mtcars[,c("cyl", "vs", "am")] %>% lapply(factor)
f6
## $cyl
##  [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
## Levels: 4 6 8
## 
## $vs
##  [1] 0 0 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 0 0 1
## Levels: 0 1
## 
## $am
##  [1] 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1
## Levels: 0 1

fct_cross(f6$cyl, f6$vs, f6$am) 
##  [1] 6:0:1 6:0:1 4:1:1 6:1:0 8:0:0 6:1:0 8:0:0 4:1:0 4:1:0 6:1:0 6:1:0 8:0:0
## [13] 8:0:0 8:0:0 8:0:0 8:0:0 8:0:0 4:1:1 4:1:1 4:1:1 4:1:0 8:0:0 8:0:0 8:0:0
## [25] 8:0:0 4:1:1 4:0:1 4:1:1 8:0:1 6:0:1 8:0:1 4:1:1
## Levels: 8:0:0 4:1:0 6:1:0 4:0:1 6:0:1 8:0:1 4:1:1
fct_c()

将多个因子变量合并成一个因子变量。

fct_c(f6$cyl, f6$vs, f6$am)
##  [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4 0 0 1 1 0 1
## [39] 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0
## [77] 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1
## Levels: 4 6 8 0 1
fct_unify()

当多个因子变量存储在列表结构(list)时,它们的类别可能各不相同。该函数在不改变变量值的情况下,将这些因子变量的类别统一化,类别取所有因子类别的并集。

fct_unify(f6)
## $cyl
##  [1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4
## Levels: 4 6 8 0 1
## 
## $vs
##  [1] 0 0 1 1 0 1 0 1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 0 0 1
## Levels: 4 6 8 0 1
## 
## $am
##  [1] 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1
## Levels: 4 6 8 0 1
lvls_union()

输出列表中所有因子变量类别的并集。

lvls_union(f6)
## [1] "4" "6" "8" "0" "1"
推荐阅读

59f887ff4a334d2327622d02649b7510.png
ggplot2基础语法系列推文汇总
1e5406d774a4eb4d3cf3a9d669bfc638.png
胶水函数用法的几个例子
fa564a26afdb511df26672373fc5ee92.png
空间计量经济模型的简单形式在R语言中的实现
5d21a916012f9a67bbf8cd620629d349.png
使用R语言的常用工具包绘制双变量填充地图
fad1547568099e413ef88766685e8fe4.png
R语言基础绘图系统的拼图功能

8b3713962b556fca16e3583a5f827212.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值