在R语言中还原因子拆分后的虚拟变量原名问题
问题:还原因子拆分后的变量原名
我之前提过类似问题,但当前场景无法复用之前的解决方案,需要基于原数据框的变量名称,将拆分后的虚拟变量名还原为原始变量名。
原始数据
原始数据框包含数值型和因子型变量:
dfOG <- data.frame( x1 = c(1,4,2), x4 = as.factor(c('yes', 'no', 'maybe')), x5 = as.factor(c(rep('yes', 2), rep('no', 1))), x41 = as.factor(c(rep('hot', 1), rep('cold', 2))) )
因子拆分的三种流程
因子变量会通过三种不可控流程之一拆分为虚拟变量,不同流程生成的命名规则不同(以x4为例):
- 流程1:仅在原变量名后添加数字,如
x41, x42, x43对应原变量x4 - 流程2:添加
.+因子水平,如x4.yes, x4.no, x4.maybe对应原变量x4 - 流程3:添加
_+因子水平,如x4_yes, x4_no, x4_maybe对应原变量x4
当前需处理的场景(流程1)
经过流程1处理后,得到如下数据框:
dfChange <- data.frame( name = c('x41', 'x43', NA, NA, 'x411', NA, 'x52', 'x42', 'x412', NA) )
期望输出
需要将dfChange$name中的元素还原为原数据框dfOG中的变量名,期望结果如下:
dfDesired <- data.frame( name = c('x4', 'x4', NA, NA, 'x41', NA, 'x5', 'x4', 'x41', NA) )
我尝试过的方案(未解决)
# 找出原数据中的因子列名称 factorColNam <- names(which(!(sapply(dfOG[colnames(dfOG)], is.numeric)))) factorCols <- which((colnames(dfOG) %in% factorColNam)) # 生成因子拆分后的变量名列表 dfnew <- list() for (i in 1:length(factorCols)) { facLevels <- unique(dfOG[ ,factorCols[i]]) dfnew[[i]] <- paste0(factorColNam[i], as.numeric(facLevels)) } # 给列表命名为原变量名 names(dfnew) <- factorColNam
我的思路是遍历这个列表,对比dfChange$name中的名称并还原,但觉得应该有更简便的方法。
补充说明:变量名称没有限制,可以是任意名称,比如含10个因子水平的x10,或含25个因子水平的banana。
内容的提问来源于stack exchange,提问作者Electrino
相关产品推荐
相关产品推荐

