R中如何通过循环与子集操作结合MICE包计算多重插补数据的均值
问题根因
with(imp, ...)执行时会在插补数据集的环境内求值,你传入的varlist[i]/rname[1]是字符串格式的变量名,不会被自动识别为数据集中的对应列,相当于你直接对字符串"Var_1"/"chl"计算均值,自然触发argument is not numeric or logical报错返回NA。
解决方案
用get()函数即可在当前求值环境中将字符串映射为对应的变量对象,无需额外引入其他包。
单条语句修复
对应你提供的可复现示例,修改后可正常返回结果:
MeanRes <- with(imp, exp = mean(subset(get(rname[1]), bmi > 25))) res <- mean(unlist(MeanRes$analyses)) # 正确返回200.688888888
批量计算函数修复
你之前的函数还存在语法缺失(少function关键字、for循环括号未闭合)、结果向量未初始化的问题,完整修复版如下:
doMean <- function(imp, varlist, filter) { # 初始化结果存储向量 saveValue <- numeric(length(varlist)) for (i in seq_along(varlist)) { # get()将字符串变量名解析为环境内的实际列 meanVal <- with(imp, exp = mean(subset(get(varlist[i]), Var_2 == filter))) saveValue[i] <- mean(unlist(meanVal$analyses)) } # 给结果命名方便匹配对应变量 names(saveValue) <- varlist return(saveValue) }
调用示例
# 传入变量名列表和过滤条件即可批量计算 varlist <- c("Var_1", "Var_4", "Var_10") result <- doMean(imp, varlist, filter = 1) # 输出结果为命名向量,直接按变量名取值即可 print(result["Var_1"])
如果需要更灵活的过滤条件(不是固定Var_2 == filter),可以进一步用表达式注入的方式实现,上述方案已经能覆盖你当前的批量计算需求。
内容的提问来源于stack exchange,提问作者rNewbie
相关产品推荐
相关产品推荐

