【上一篇:60.关于调整因子的属性levels的order(二)】
【下一篇:62.关于日期和时间之创建】
比改变levels的顺序更强大的是改变levels的值。改变levels的值可以clarity labels和collapse levels。
有三个相关的函数:fct_recode()、fct_collapse()、fct_lump()。
fct_recode()重编码、改变levels的值
Change factor levels by hand
fct_recode(.f, ...)
.f:因子
...:格式为new level=old level的键值对,可以是多个,用逗号分割即可
old level要用双引号括起来;如果new level中有特殊符号,则也要用双引号括起来,否则不同
gss_cat中的partyid很简洁且不一致:
> levels(gss_cat$partyid)
[1] "No answer" "Don't know" "Other party"
[4] "Strong republican" "Not str republican" "Ind,near rep"
[7] "Independent" "Ind,near dem" "Not str democrat"
[10] "Strong democrat"
可以修改下:
new <- gss_cat %>% mutate(partyid = fct_recode(partyid,
"Republican, strong" = "Strong republican",
"Republican, weak" = "Not str republican",
"Independent, near rep" = "Ind,near rep",
"Independent, near dem" = "Ind,near dem",
"Democrat, weak" = "Not str democrat",
"Democrat, strong" = "Strong democrat"
))
> levels(new$partyid)
[1] "No answer" "Don't know" "Other party"
[4] "Republican, strong" "Republican, weak" "Independent, near rep"
[7] "Independent" "Independent, near dem" "Democrat, weak"
[10] "Democrat, strong"
**字符串向量(下文称vector)和levels的关系:
1) levels的值是vector唯一值的集合
2) levels的值的集合可以比vector唯一值的集合大,但vector唯一值的集合必须完全包含与levels值的集合
3) 不同的vector值可以对应同一个levels值,但不同的levels值不能对应同一个vector值
4) 改变levels的值,对应vector的值会随之改变;改变vector的值,如果新值在levels值中存在,则相当于不同的vector值对应同一个levels值,如果不在levels值中,则会变成NA并提升值在levels中不存在
**
知道了这些,就能理解记忆下面的fct_recode()的用法了:
> (x <- factor(c("apple", "bear", "banana", "dear")))
[1] apple bear banana dear
Levels: apple banana bear dear
# 将apple和banana都改成fruit
> fct_recode(x, fruit = "apple", fruit = "banana")
[1] fruit bear fruit dear
Levels: fruit bear dear
# 去掉一个level,此时向量中对应的值会变成NA
> fct_recode(x, NULL = "apple", fruit = "banana")
[1] <NA> bear fruit dear
Levels: fruit bear dear
# 如果...是一个包含键值对的向量,则需要用!!!引用
> x <- factor(c("apple", "bear", "banana", "dear"))
> levels <- c(fruit = "apple", fruit = "banana")
> fct_recode(x, !!!levels)
[1] fruit bear fruit dear
Levels: fruit bear dear
fct_collapse() 批量折叠levels
Collapse factor levels into manually defined groups
上文提到fct_recode()可以手动折叠少量的levels,例如例子中将"apple"和"banana"都变成fruit。当这种折叠很多时,用fct_collapse()更简洁。
fct_collapse(.f, ..., other_level = NULL, group_other = "DEPRECATED")
.f :因子
...:格式为new value=old value vector的键值对,多个值用逗号分割,具体可以看下面例子中的格式
other_level:表示不理解^_^
group_other:这个参数废弃了
gss_cat %>%
mutate(partyid = fct_collapse(partyid,
other = c("No answer", "Don't know", "Other party"),
rep = c("Strong republican", "Not str republican"),
ind = c("Ind,near rep", "Independent", "Ind,near dem"),
dem = c("Not str democrat", "Strong democrat")
))
fct_lump()将因子levels组合成other
Lump together factor levels into "other"
这个函数有一个家族,fct_lump()的存在是历史原因,因为它会自动根据设置的参数在其他不同的方法之间选择,官方建议不使用它:
# 会根据设置的参数自动选择方法
fct_lump(
f,
n,
prop,
w = NULL,
other_level = "Other",
ties.method = c("min", "average", "first", "last", "random", "max")
)
# 折叠出现次数少于min的levels
fct_lump_min(f, min, w = NULL, other_level = "Other")
# 折叠出现次数少于prop * length(f)的levels
fct_lump_prop(f, prop, w = NULL, other_level = "Other")
# 折叠除了频率最高的n个levels之外的其他levels
fct_lump_n(
f,
n,
w = NULL,
other_level = "Other",
ties.method = c("min", "average", "first", "last", "random", "max")
)
# 折叠频率最低的levels,但确保Other仍然是最低的频率
fct_lump_lowfreq(f, other_level = "Other")
总结下来就是:
1) 设置一个频率阈值,高于(或低于)此频率的保留,对应fct_lump_min()和fct_lump_prop()
2) 保留频率最高(或最低)的levels,对应fct_lump_n()
3)折叠最低频率的levels,但要保证折叠后的other仍然是频率最低的,对应函数fct_lump_lowfreq()
min:对应fct_lump_min(),保留出现次数不少于min的levels
prop:对应fct_lump_prop(),正值表示保留出现次数不少于proplength(f)的levels,负值表示保留出现次数不大于proplength(f)的levels。
n:对应fct_lump_n(),正值表示保留频率最高的前n个levels,负值表示保留频率最低的前n个levels。
w:是长度等于f的向量,指定统计频率时f中每个值的权重。(PS:目前还不清楚有什么应用)
other_level:指定折叠后新level的名字,默认时Other,总是放在其他levels的后面。
ties.method:ties是"结"的意思,在这里表示折叠时候的临界点,也就是如果临界点处有多个出现次数相同的levels,那选择保留哪个折叠哪个呢?选项有min(尽量少折叠,即多保留),max(尽量多折叠,即少保留)、average(对相同值求平均,折叠不大于平均值的level)、first(保留第一个)、last(保留最后一个)。
个人笔记,个人理解,如有不对,欢迎评论区指正,也欢迎在评论区交流。
网友评论