R语言中如何将因子值替换为下一个更高的因子水平
R语言因子顺次取值替换实现方案
需求说明
需将因子的每个取值替换为按数值排序后高一级的因子水平,其中最大的因子水平统一替换为NA。
初始示例数据
set.seed(1) have <- sample(1:20, 10, TRUE) have # [1] 4 7 1 2 11 14 18 19 1 10
预期输出结果:
# [1] 7 10 2 4 14 18 19 <NA> 2 11
基础实现方案
可直接通过修改因子水平的映射关系实现:
want <- factor(have) levels(want) <- c(levels(want)[-1], NA) want # [1] 7 10 2 4 14 18 19 <NA> 2 11 # Levels: 2 4 7 10 11 14 18 19
其他可选实现函数
函数代码
# 查找表映射实现 func_lookup <- function(x){ lu <- sort(unique(x)) lu <- "[<-"(NA, lu, c(lu[-1], NA)) lu[x] } # dplyr工具实现 func_dplyr <- function(x){ levels(x) <- dplyr::lead(levels(x)) x } # 基础R通用实现 func_base <- function(x){ vals <- sort(unique(x)) vals[match(x, vals) + 1] }
适配性测试
测试用例构造:
set.seed(1) # 普通数值向量 have <- c(4, 6, 6, 7) # 对应因子对象 have_f <- factor(have)
因子对象入参测试结果
have_f # [1] 4 6 6 7 # Levels: 4 6 7 func_lookup(have_f) # [1] 2 3 3 NA func_dplyr(have_f) # [1] 6 7 7 <NA> # Levels: 6 7 func_base(have_f) # [1] 6 7 7 <NA> # Levels: 4 6 7
普通数值向量入参测试结果
func_lookup(have) # [1] 6 7 7 NA # func_dplyr(have) 仅支持因子入参,处理普通向量会报错 func_base(have) # [1] 6 7 7 NA
适用范围总结
func_lookup:仅适配普通数值向量;传入因子时会因因子底层整数编码的特性,出现取值映射错误func_dplyr:仅适配因子对象,不支持普通向量入参func_base:同时兼容因子、普通向量两类入参,通用性最强
内容的提问来源于stack exchange,提问作者A.Fischer
相关产品推荐
相关产品推荐

