学堂君根据功能对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](https://img-blog.csdnimg.cn/img_convert/59f887ff4a334d2327622d02649b7510.png)
![1e5406d774a4eb4d3cf3a9d669bfc638.png](https://img-blog.csdnimg.cn/img_convert/1e5406d774a4eb4d3cf3a9d669bfc638.png)
![fa564a26afdb511df26672373fc5ee92.png](https://img-blog.csdnimg.cn/img_convert/fa564a26afdb511df26672373fc5ee92.png)
![5d21a916012f9a67bbf8cd620629d349.png](https://img-blog.csdnimg.cn/img_convert/5d21a916012f9a67bbf8cd620629d349.png)
![fad1547568099e413ef88766685e8fe4.png](https://img-blog.csdnimg.cn/img_convert/fad1547568099e413ef88766685e8fe4.png)
![8b3713962b556fca16e3583a5f827212.png](https://img-blog.csdnimg.cn/img_convert/8b3713962b556fca16e3583a5f827212.png)