You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 12:15:42