R语言中替换因子列NA值后列类型转为字符的问题
解决因子列替换NA后变为字符型的问题
这个问题我之前也踩过坑!sapply在这里会偷偷把你的因子列转换成字符型——因为它默认会把处理结果简化成矩阵,而矩阵里所有元素的类型必须一致,因子就被强制转成字符了。给你几个实用的解决办法:
方法1:用lapply替代sapply
lapply返回的是列表,能保留每一列原本的因子类型,不会做强制转换。直接替换原代码里的sapply就行:
# 定义目标列 varToCat = c("V21A","A3","Escolari","A17","B8","C5B","RamaEmpPri","C11","C16B", "C16C","D4B","D4C","RamaEmpSec","RamaUltEmpCesant","G12", "RamaFuerzaTrab","OcupFuerzaTrab","ActNoMer") # 用lapply处理,保留因子类型 cop2014[, varToCat] <- lapply(cop2014[, varToCat], function(col) { replace(col, is.na(col), last(levels(col))) })
处理完后再用table(sapply(cop2014[, varToCat], class))检查,这些列应该还是factor类型。
方法2:用dplyr的mutate_at(tidyverse风格)
如果你习惯用tidyverse工具,这个方法代码更简洁,同样能完美保留因子类型:
library(dplyr) cop2014 <- cop2014 %>% mutate_at(vars(varToCat), ~replace(., is.na(.), last(levels(.))))
方法3:如果坚持用sapply,手动转回到因子
这个方法稍显繁琐,但也能解决问题——处理完后手动把每一列重新转成因子,并且指定原来的水平:
cop2014[, varToCat] <- sapply(cop2014[, varToCat], function(col) { # 先保存原列的因子水平 col_levels <- levels(col) # 替换NA值 col <- replace(col, is.na(col), last(col_levels)) # 重新转成因子,用原水平 factor(col, levels = col_levels) })
内容的提问来源于stack exchange,提问作者user4104
相关产品推荐
相关产品推荐

