美文网首页
61.关于调整因子的属性levels的值

61.关于调整因子的属性levels的值

作者: 心惊梦醒 | 来源:发表于2021-09-18 00:50 被阅读0次

【上一篇: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(保留最后一个)。


    个人笔记,个人理解,如有不对,欢迎评论区指正,也欢迎在评论区交流。

【上一篇:60.关于调整因子的属性levels的order(二)】
【下一篇:62.关于日期和时间之创建】

相关文章

网友评论

      本文标题:61.关于调整因子的属性levels的值

      本文链接:https://www.haomeiwen.com/subject/izgsgltx.html