为何用lapply/apply执行Anderson-Darling测试仅返回部分列结果?求解决方案
问题原因及解决办法
可能的原因
- 非数值型列存在:
ad.test(来自nortest包)仅支持数值型向量,数据框里的字符、因子、逻辑型列会被直接跳过,不会返回测试结果。 - 列包含缺失值(NA):默认情况下,
ad.test遇到NA会报错,lapply/apply不会主动展示错误,只会忽略这些列的结果。 - 样本量不达标:该测试对样本量有最低要求(通常至少5个有效观测值),样本量不足的列无法完成测试,结果不会被返回。
对应解决办法
1. 只保留数值型列
先筛选出数据框里的所有数值列,再执行测试:
# 加载nortest包 library(nortest) # 筛选数值型列 df_num <- df4[sapply(df4, is.numeric)] # 执行测试 lapply(df_num, ad.test)
2. 处理缺失值
如果列中有NA,可以先移除缺失值再测试:
lapply(df_num, function(x) ad.test(na.omit(x)))
3. 过滤样本量不足的列
先检查每列的有效样本量,只保留符合要求的列:
# 保留有效观测数≥5的列 df_filtered <- df_num[, sapply(df_num, function(x) length(na.omit(x)) >= 5)] lapply(df_filtered, ad.test)
另一种更清晰的实现(批量处理并捕获错误)
用purrr包的map函数可以更直观地处理每个列,同时捕获错误信息,避免遗漏:
library(purrr) library(nortest) # 对每列执行测试,捕获错误并返回原因 map(df4, function(x) { if (!is.numeric(x)) { return("非数值型列,无法执行测试") } x_clean <- na.omit(x) if (length(x_clean) < 5) { return("有效样本量不足,无法执行测试") } ad.test(x_clean) })
内容的提问来源于stack exchange,提问作者RIYA
相关产品推荐
相关产品推荐

