R语言函数嵌套调用问题:Dummy编码函数无法正确提取变量名
问题原因
调用x.to.dummy(df$variable1)时,R会先执行df$variable1得到一个向量,再将向量传入函数。此时x.to.dummy内部的x是已提取后的向量,丢失了df$variable1这个原始表达式的上下文,expr.to.name.in.func无法获取真正的变量名variable1,只能拿到函数参数名或错误返回"expr"。
修复方案
修改x.to.dummy,让它接收原始表达式而非提前计算的向量,在函数内部再计算变量值并提取名称:
x.to.dummy <- function(x) { # 捕获传入的原始表达式 expr_x <- substitute(x) # 计算变量的实际值 x_val <- eval(expr_x, envir = parent.frame()) # 初始化输出数据框 df_out <- as.data.frame(x_val) # 生成哑变量列名(处理特殊字符) ux <- unique(x_val) dummy_col_names <- make.names(ux, unique = TRUE) # 添加空的哑变量列 for (col_name in dummy_col_names) { df_out[[col_name]] <- as.numeric(rep(NA, nrow(df_out))) } # 获取原始变量名并设置列名 var_name <- expr.to.name.in.func(expr_x) colnames(df_out) <- c(var_name, dummy_col_names) # 填充哑变量值 for (i in seq_along(dummy_col_names)) { df_out[[dummy_col_names[i]]] <- ifelse(x_val == ux[i], 1, 0) } return(df_out) } # 保留原有的expr.to.name.in.func函数 expr.to.name.in.func <- function(expr) { expr_cp <- substitute(expr, env = parent.frame()) if (is.name(expr_cp)) { return(as.character(expr_cp)) } else { oper <- as.character(expr_cp[[1]]) name_out <- switch(oper, "$" = deparse(expr_cp[[3]]), "[[" = deparse(expr_cp[[3]]), "[" = deparse(expr_cp[[3]]), deparse(expr)) return(name_out) } }
测试验证
创建测试数据并调用函数:
df <- data.frame(variable1 = c("a", "b", "a", "c")) df$variable1 <- x.to.dummy(df$variable1) print(df$variable1)
输出的第一列名称会是variable1,后续列对应各水平的哑变量。
内容的提问来源于stack exchange,提问作者alsamixer
相关产品推荐
相关产品推荐

