在R中执行Shapiro检验时如何忽略特定列含NA的行(不删除行)
问题描述
需要对如下数据框按subject分组执行Shapiro检验,但第5行measurement列的NA值会影响结果,希望不删除该行的前提下在分析时忽略它。尝试使用byf.shapiro(dados_novo$measurement ~ dados_novo$subject, dados_novo, na.rm=TRUE)无效。
数据框:
| id | subject | measurement |
|---|---|---|
| 1 | control | 0.151708 |
| 2 | control | 0.239930 |
| 3 | patient | 0.104289 |
| 4 | patient | 0.329139 |
| 5 | patient | NA |
可行解决方案
方法1:临时过滤NA值(不改动原数据)
byf.shapiro本身不支持na.rm参数,你之前添加的该参数会被函数忽略。可以先生成不含NA的临时数据集,或者直接在函数调用中用na.omit()处理数据:
# 直接在函数中处理数据,原数据框不受影响 byf.shapiro(measurement ~ subject, data = na.omit(dados_novo)) # 或者先创建临时子集,再执行分析 temp_data <- dados_novo[!is.na(dados_novo$measurement), ] byf.shapiro(measurement ~ subject, data = temp_data)
方法2:手动分组后处理NA
如果需要更灵活的控制,可先按subject分组,再对每组单独去除NA后执行Shapiro检验:
# 按subject拆分数据,每组自动剔除NA后做检验 lapply(split(dados_novo$measurement, dados_novo$subject), function(x) shapiro.test(na.omit(x)))
关键说明
上述所有方法都不会修改原始数据框dados_novo,第5行的NA会被保留,仅在分析过程中被排除。
内容的提问来源于stack exchange,提问作者Étalo César Porto Xavier
相关产品推荐
相关产品推荐

