如何在不修改原向量的情况下让因子中2006与2001共享同一水平?
解决R语言因子映射问题
首先明确:因子的非NA元素必须属于指定的levels集合,所以如果期望结果中显示2006,则levels里必须包含2006,否则该值会被转为<NA>。但如果你的核心需求是不修改原year向量,将2006归为2001的水平组,同时保留2006的显示(或实现类似效果),可以用以下两种方案:
方案1:将2006映射为2001水平(显示为2001)
不修改原year向量,在转换因子时临时替换2006为2001:
year = c(1991,1996,2001,2006,2011,2016,2021) # 临时替换2006为2001,不改变原向量 f <- factor(ifelse(year == 2006, 2001, year), levels = c(1991,1996,2001,2011,2016,2021))
运行结果:
[1] 1991 1996 2001 2001 2011 2016 2021 Levels: 1991 1996 2001 2011 2016 2021
方案2:保留2006显示,归为2001水平组(需扩展levels)
如果希望显示2006但统计时和2001视为同一组,可以用forcats包的fct_collapse合并水平,自定义显示标签:
library(forcats) year = c(1991,1996,2001,2006,2011,2016,2021) f <- fct_collapse(year, "2001/2006" = c("2001", "2006"), !!!set_names(as.character(c(1991,1996,2011,2016,2021)), as.character(c(1991,1996,2011,2016,2021))))
运行结果:
[1] 1991 1996 2001/2006 2001/2006 2011 2016 2021 Levels: 1991 1996 2001/2006 2011 2016 2021
关于你期望的结果说明
你给出的期望结果中,向量显示2006但levels里不包含2006,这不符合因子的工作逻辑——因子的非NA元素必须是levels中的一员,因此这种结果无法实现。如果只是想让2006不转为NA,只需将其加入levels即可:
year = c(1991,1996,2001,2006,2011,2016,2021) f <- factor(year, levels = c(1991,1996,2001,2011,2016,2021,2006))
运行结果:
[1] 1991 1996 2001 2006 2011 2016 2021 Levels: 1991 1996 2001 2011 2016 2021 2006
内容的提问来源于stack exchange,提问作者doraemon
相关产品推荐
相关产品推荐

