清理因子水平(折叠多个级别/标签)

清理因子水平(折叠多个级别/标签)

清理包含需要折叠的多个级别的因子的最有效(即有效/适当)方法是什么?也就是说,如何将两个或多个因子级别组合成一个。

这是一个示例,其中“是”和“Y”这两个级别应折叠为“是”,“否”和“N”折叠为“否”:

## Given: x <- c("Y", "Y", "Yes", "N", "No", "H")   # The 'H' should be treated as NA## expectedOutput[1] Yes  Yes  Yes  No   No   <NA>Levels: Yes No  # <~~ NOTICE ONLY **TWO** LEVELS

一个选择当然是在手工使用sub和朋友之前清理琴弦。

另一种方法是允许重复标签,然后丢弃它们

## Duplicate levels ==> "Warning: deprecated"x.f <- factor(x, levels=c("Y", "Yes", "No", "N"), labels=c("Yes", "Yes", "No", "No"))## the above line can be wrapped in either of the next two linesfactor(x.f)      droplevels(x.f)

但是,有更有效的方法吗?


虽然我知道levelslabels参数应该是向量,但我尝试了列表和命名列表以及命名向量以查看发生了什么不用说,以下没有一个让我更接近我的目标。

  factor(x, levels=list(c("Yes", "Y"), c("No", "N")), labels=c("Yes", "No"))
  factor(x, levels=c("Yes", "No"), labels=list(c("Yes", "Y"), c("No", "N")))

  factor(x, levels=c("Y", "Yes", "No", "N"), labels=c(Y="Yes", Yes="Yes", No="No", N="No"))
  factor(x, levels=c("Y", "Yes", "No", "N"), labels=c(Yes="Y", Yes="Yes", No="No", No="N"))
  factor(x, levels=c("Yes", "No"), labels=c(Y="Yes", Yes="Yes", No="No", N="No"))


眼眸繁星
浏览 724回答 3
3回答

动漫人物

由于问题的标题是清理因子水平(折叠多个级别/标签),forcats为了完整起见,此处也应该提到包。forcats于2016年8月在CRAN上亮相。有几种便利功能可用于清理因子水平:x&nbsp;<-&nbsp;c("Y",&nbsp;"Y",&nbsp;"Yes",&nbsp;"N",&nbsp;"No",&nbsp;"H")&nbsp;library(forcats)将要素级别折叠为手动定义的组fct_collapse(x,&nbsp;Yes&nbsp;=&nbsp;c("Y",&nbsp;"Yes"),&nbsp;No&nbsp;=&nbsp;c("N",&nbsp;"No"),&nbsp;NULL&nbsp;=&nbsp;"H")#[1]&nbsp;Yes&nbsp;&nbsp;Yes&nbsp;&nbsp;Yes&nbsp;&nbsp;No&nbsp;&nbsp;&nbsp;No&nbsp;&nbsp;&nbsp;<NA>#Levels:&nbsp;No&nbsp;Yes手动改变因子水平fct_recode(x,&nbsp;Yes&nbsp;=&nbsp;"Y",&nbsp;Yes&nbsp;=&nbsp;"Yes",&nbsp;No&nbsp;=&nbsp;"N",&nbsp;No&nbsp;=&nbsp;"No",&nbsp;NULL&nbsp;=&nbsp;"H")#[1]&nbsp;Yes&nbsp;&nbsp;Yes&nbsp;&nbsp;Yes&nbsp;&nbsp;No&nbsp;&nbsp;&nbsp;No&nbsp;&nbsp;&nbsp;<NA>#Levels:&nbsp;No&nbsp;Yes自动重新标记因子水平,必要时崩溃fun&nbsp;<-&nbsp;function(z)&nbsp;{ &nbsp;&nbsp;z[z&nbsp;==&nbsp;"Y"]&nbsp;<-&nbsp;"Yes" &nbsp;&nbsp;z[z&nbsp;==&nbsp;"N"]&nbsp;<-&nbsp;"No" &nbsp;&nbsp;z[!(z&nbsp;%in%&nbsp;c("Yes",&nbsp;"No"))]&nbsp;<-&nbsp;NA &nbsp;&nbsp;z}fct_relabel(factor(x),&nbsp;fun)#[1]&nbsp;Yes&nbsp;&nbsp;Yes&nbsp;&nbsp;Yes&nbsp;&nbsp;No&nbsp;&nbsp;&nbsp;No&nbsp;&nbsp;&nbsp;<NA>#Levels:&nbsp;No&nbsp;Yes请注意,它fct_relabel()适用于因子级别,因此它需要一个因子作为第一个参数。另外两个函数,fct_collapse()也fct_recode()接受一个字符向量,它是一个未记录的特征。首次出现重新排序因子水平OP给出的预期输出是[1]&nbsp;Yes&nbsp;&nbsp;Yes&nbsp;&nbsp;Yes&nbsp;&nbsp;No&nbsp;&nbsp;&nbsp;No&nbsp;&nbsp;&nbsp;<NA>Levels:&nbsp;Yes&nbsp;No这里的级别按其出现的顺序排序x,与默认级别不同(?factor:默认情况下,因子的级别已排序)。为了与预期输出一致,可以通过fct_inorder()&nbsp;在折叠级别之前使用来实现:fct_collapse(fct_inorder(x),&nbsp;Yes&nbsp;=&nbsp;c("Y",&nbsp;"Yes"),&nbsp;No&nbsp;=&nbsp;c("N",&nbsp;"No"),&nbsp;NULL&nbsp;=&nbsp;"H")fct_recode(fct_inorder(x),&nbsp;Yes&nbsp;=&nbsp;"Y",&nbsp;Yes&nbsp;=&nbsp;"Yes",&nbsp;No&nbsp;=&nbsp;"N",&nbsp;No&nbsp;=&nbsp;"No",&nbsp;NULL&nbsp;=&nbsp;"H")现在,两者都以相同的顺序返回预期输出。

哈士奇WWW

也许命名向量作为键可能是有用的:>&nbsp;factor(unname(c(Y&nbsp;=&nbsp;"Yes",&nbsp;Yes&nbsp;=&nbsp;"Yes",&nbsp;N&nbsp;=&nbsp;"No",&nbsp;No&nbsp;=&nbsp;"No",&nbsp;H&nbsp;=&nbsp;NA)[x]))[1]&nbsp;Yes&nbsp;&nbsp;Yes&nbsp;&nbsp;Yes&nbsp;&nbsp;No&nbsp;&nbsp;&nbsp;No&nbsp;&nbsp;&nbsp;<NA>Levels:&nbsp;No&nbsp;Yes这看起来与你上一次尝试非常相似......但是这个有效:-)
打开App,查看更多内容
随时随地看视频慕课网APP