R语言如何通过变量名获取dataframe的对应列索引?
R实现通过
df$列名格式反查对应列索引的方案 核心功能实现
你需要的COLINDEX功能可以通过捕获参数表达式、提取列名、匹配列索引三步实现:
COLINDEX <- function(data, vec) { # 捕获传入vec的表达式,提取$后的列名字符串 col_name <- sub("^.*\\$", "", deparse(substitute(vec))) # 返回匹配到的列索引 return(which(colnames(data) == col_name)) }
效果验证
用你给出的示例df测试:
# 构造示例数据框 df <- data.frame( Mean = c(1, 1.5, 0.7, 0.3), Var = c(0.5, 0.4, 0.3, 0.1), Max = c(3, 4, 2.5, 0.5), row.names = c("a", "b", "c", "d") ) # 测试查询df$Var的列索引 COLINDEX(df, df$Var)
输出结果为2,符合需求。
适配到你的自定义函数
你可以直接调用上面的COLINDEX函数,也可以把逻辑直接内嵌到自定义函数中,避免额外定义函数,优化后的完整代码如下:
my_fct <- function(data, v_cont, v_cat){ # 初始化结果矩阵,避免rbind报错 mat_stat <- c() # 提取v_cat对应的列名和索引 cat_col_name <- sub("^.*\\$", "", deparse(substitute(v_cat))) col_idx <- which(colnames(data) == cat_col_name) # 提前计算因子水平,避免循环内重复运算 cat_levels <- levels(as.factor(v_cat)) for (i in 1:length(cat_levels)){ sub <- subset(data , v_cat == cat_levels[i]) sub_stat <- c(cat_levels[i], mean(sub[, col_idx], na.rm = TRUE)) mat_stat <- rbind(mat_stat, sub_stat) } rownames(mat_stat) <- NULL return(mat_stat) }
调用示例
# 传入指定格式的参数 my_fct(df, df$Mean, df$Var)
内容的提问来源于stack exchange,提问作者Corentvn
相关产品推荐
相关产品推荐

