R语言lapply对dataframe列表应用多函数的报错问题求解
问题排查
你遇到的报错由多个错误共同导致,核心问题如下:
- 函数内部重复调用
lapply:FinalStats是被外层lapply(df, ...)调用的,接收的参数x是单个元素对应的dataframe,不需要再对x做lapply调用SampleZScores,直接调用即可,否则会返回list类型,和数值比较时直接触发类型转换报错。 - 变量名拼写错误:代码中出现了未定义的变量
y、labmedians、MscoreMax,会直接引发执行错误。 - if判断逻辑错误:直接用Zscore矩阵和单个数值比较,且未处理NA值。if判断需要接收单个TRUE/FALSE值,用
any()函数结合na.rm=TRUE即可过滤NA,正常判断是否存在异常值。 - 变量作用域问题:
Mexceed变量仅在else分支定义,若走无异常值的均值分支,会出现变量未定义的错误。
修复后完整代码
# 加载依赖包 library(outliers) # 定义阈值常量 ZMax <- 3 MscoreMax <- 3.5 # ZScore计算函数 SampleZScores <- function(x,...){ unlistdata <- unlist(x[-1]) GrandMean <- mean(unlistdata,na.rm = T) GrandSD <- sd(unlistdata,na.rm=T) ZScore <- abs(((x[-1])-GrandMean)/GrandSD) return(ZScore) } # 支持NA的得分计算函数 scores_na <- function(x, ...) { not_na <- !is.na(x) scores <- rep(NA, length(x)) scores[not_na] <- outliers::scores(na.omit(x), ...) scores } # 最终统计函数 FinalStats <- function(x,...){ # 计算当前元素的Zscore Zscores <- SampleZScores(x,na.rm=T) # 判断是否存在Zscore异常值,自动忽略NA has_z_outlier <- any(Zscores >= ZMax, na.rm = TRUE) # 初始化变量避免作用域错误 ConsensusValue <- NA Uncertainty <- NA if(!has_z_outlier){ # 无Z异常值走均值逻辑 LabMean <- mapply(mean, x[-1], na.rm = T) LabMean[is.infinite(LabMean)] <- NA ConsensusValue <- mean(LabMean,na.rm=T) SD.All <- unlist(x[-1]) Uncertainty <- sd(SD.All, na.rm = T) }else{ # 有Z异常值走中位数+MScore逻辑 LabMedian <- mapply(median, x[-1], na.rm = T) LabMedian[is.infinite(LabMedian)] <- NA # 计算MScore,排除全NA的实验室 valid_lab <- !is.na(LabMedian) valid_medians <- LabMedian[valid_lab] MScore <- round(abs(scores_na(valid_medians, "mad")), digits = 2) Mexceed <- length(MScore[MScore > MscoreMax]) # 判断异常占比 if(Mexceed > 0.25*length(valid_medians)){ Uncertainty <- NA }else{ # 不确定度取MAD值 Uncertainty <- mad(valid_medians, na.rm = TRUE) } ConsensusValue <- median(LabMedian,na.rm=T) } FinalValues <- cbind(ConsensusValue,Uncertainty) return(FinalValues) } # 批量计算所有元素 CatergoreisStats <- lapply(df,FinalStats)
运行结果示例
> CatergoreisStats $Al2O3 ConsensusValue Uncertainty [1,] 2.085393 0.03017355 $As ConsensusValue Uncertainty [1,] 0.00200 NA $Ba ConsensusValue Uncertainty [1,] 0.002947835 0.0007410375
内容的提问来源于stack exchange,提问作者Spooked
相关产品推荐
相关产品推荐

