You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言for循环执行Shapiro-Wilk检验后如何将结果存入数据框

R 按ID分组执行Shapiro-Wilk检验并整理结果的解决方案

前提说明

  • Shapiro-Wilk检验不允许输入含缺失值的向量,执行前需过滤Values列的NA值
  • 检验逻辑:原假设H0为「当前分组Values服从正态分布」,若p值<0.05则拒绝H0(接受H1,判定为非正态);若p值≥0.05则不拒绝H0(判定为正态)

方案1:基于你现有循环代码的修改版

# 加载包&准备数据
library(data.table)
setDT(df) # 提前将df转为data.table,无需循环内重复操作

uniq_id <- unique(df$ID)
number_loops <- length(uniq_id)
headings <- c("ID", "Wilk", "p_value","结论")

# 初始化结果表并设置列名
df_table <- as.data.frame(matrix(NA, nrow = number_loops, ncol = length(headings)))
colnames(df_table) <- headings

# 循环执行检验并填充结果
for (row_idx in 1:number_loops) {
  current_id <- uniq_id[row_idx]
  # 提取当前ID的非NA Values
  current_values <- df[ID == current_id, Values[!is.na(Values)]]
  # 执行检验
  s <- shapiro.test(current_values)
  # 填充当前行结果
  df_table$ID[row_idx] <- current_id
  df_table$Wilk[row_idx] <- s$statistic
  df_table$p_value[row_idx] <- s$p.value
  # 判定结论
  df_table$结论[row_idx] <- ifelse(s$p.value < 0.05, "non-normal/接受H1", "normal")
}

# 查看最终结果
print(df_table)

方案2:更简洁的data.table原生分组实现(无需手动写循环)

library(data.table)
setDT(df)

df_table <- df[!is.na(Values), # 先过滤全表NA值
               .(Wilk = shapiro.test(Values)$statistic,
                 p_value = shapiro.test(Values)$p.value,
                 结论 = ifelse(shapiro.test(Values)$p.value < 0.05, "non-normal/接受H1", "normal")),
               by = ID] # 按ID分组计算

输出示例

最终得到的df_table结构如下:

IDWilkp_value结论
F10.88212230.2562709normal
F20.93588240.5860217normal
F30.74034030.00549108non-normal/接受H1
F40.90597430.3951848normal

内容的提问来源于stack exchange,提问作者pipts

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 18:57:01