清理因子水平(折叠多个级别/标签)清理包含需要折叠的多个级别的因子的最有效(即有效/适当)方法是什么?也就是说,如何将两个或多个因子级别组合成一个。这是一个示例,其中“是”和“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)但是,有更有效的方法吗?虽然我知道levels和labels参数应该是向量,但我尝试了列表和命名列表以及命名向量以查看发生了什么不用说,以下没有一个让我更接近我的目标。 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"))
3 回答
动漫人物
TA贡献1815条经验 获得超10个赞
由于问题的标题是清理因子水平(折叠多个级别/标签),forcats
为了完整起见,此处也应该提到包。forcats
于2016年8月在CRAN上亮相。
有几种便利功能可用于清理因子水平:
x <- c("Y", "Y", "Yes", "N", "No", "H") library(forcats)
将要素级别折叠为手动定义的组
fct_collapse(x, Yes = c("Y", "Yes"), No = c("N", "No"), NULL = "H")#[1] Yes Yes Yes No No <NA>#Levels: No Yes
手动改变因子水平
fct_recode(x, Yes = "Y", Yes = "Yes", No = "N", No = "No", NULL = "H")#[1] Yes Yes Yes No No <NA>#Levels: No Yes
自动重新标记因子水平,必要时崩溃
fun <- function(z) { z[z == "Y"] <- "Yes" z[z == "N"] <- "No" z[!(z %in% c("Yes", "No"))] <- NA z}fct_relabel(factor(x), fun)#[1] Yes Yes Yes No No <NA>#Levels: No Yes
请注意,它fct_relabel()
适用于因子级别,因此它需要一个因子作为第一个参数。另外两个函数,fct_collapse()
也fct_recode()
接受一个字符向量,它是一个未记录的特征。
首次出现重新排序因子水平
OP给出的预期输出是
[1] Yes Yes Yes No No <NA>Levels: Yes No
这里的级别按其出现的顺序排序x
,与默认级别不同(?factor
:默认情况下,因子的级别已排序)。
为了与预期输出一致,可以通过fct_inorder()
在折叠级别之前使用来实现:
fct_collapse(fct_inorder(x), Yes = c("Y", "Yes"), No = c("N", "No"), NULL = "H")fct_recode(fct_inorder(x), Yes = "Y", Yes = "Yes", No = "N", No = "No", NULL = "H")
现在,两者都以相同的顺序返回预期输出。
哈士奇WWW
TA贡献1799条经验 获得超6个赞
也许命名向量作为键可能是有用的:
> factor(unname(c(Y = "Yes", Yes = "Yes", N = "No", No = "No", H = NA)[x]))[1] Yes Yes Yes No No <NA>Levels: No Yes
这看起来与你上一次尝试非常相似......但是这个有效:-)
- 3 回答
- 0 关注
- 766 浏览
添加回答
举报
0/150
提交
取消