如何将R语言中循环执行Kolmogorov-Smirnov检验的结果存储为数据框?
解决方案:将KS检验循环结果整理为数据框
我来帮你解决这个问题!要把循环执行的Kolmogorov-Smirnov检验结果整理成结构化的数据框,核心思路是在每次检验后提取关键信息(对比组名称、统计量D、p值),并逐步收集到一个空数据框中。下面是更鲁棒且清晰的实现方式:
步骤1:提取Trial列名(避免依赖列索引)
先从两个数据框中提取所有以Trial开头的列名,这样即使后续数据框的列数或顺序变化,代码也能正常运行:
# 获取Kurve1和Kurve2中的Trial列名 kurve1_trials <- colnames(Kurve1)[grepl("Trial", colnames(Kurve1))] kurve2_trials <- colnames(Kurve2)[grepl("Trial", colnames(Kurve2))]
步骤2:创建空结果数据框
预先定义好结果数据框的列结构,方便后续填充内容:
# 创建空结果数据框 ks_results_df <- data.frame( Group1 = character(), # Kurve1中的试验组 Group2 = character(), # Kurve2中的试验组 D_statistic = numeric(), # KS检验的D统计量 p_value = numeric(), # 检验的p值 stringsAsFactors = FALSE )
步骤3:循环执行KS检验并收集结果
遍历所有Trial列的两两组合,执行单侧(greater)KS检验,并把结果添加到数据框中:
# 双重循环执行检验并收集结果 for (g1 in kurve1_trials) { for (g2 in kurve2_trials) { # 执行KS检验 ks_test <- ks.test(Kurve1[[g1]], Kurve2[[g2]], alternative = "greater") # 提取本次检验的关键信息 result_row <- data.frame( Group1 = g1, Group2 = g2, D_statistic = ks_test$statistic, p_value = ks_test$p.value, stringsAsFactors = FALSE ) # 将当前结果行添加到总数据框 ks_results_df <- rbind(ks_results_df, result_row) } }
可选:仅保留不重复的组合(上三角)
如果不需要所有两两组合(比如不想重复对比Trial.1-Trial.2和Trial.2-Trial.1),可以调整循环逻辑只保留上三角组合:
# 创建空数据框存储不重复的结果 ks_results_upper <- data.frame( Group1 = character(), Group2 = character(), D_statistic = numeric(), p_value = numeric(), stringsAsFactors = FALSE ) for (i in seq_along(kurve1_trials)) { for (j in seq_along(kurve2_trials)) { # 仅保留i < j的组合,可根据需求改为i <= j if (i < j) { g1 <- kurve1_trials[i] g2 <- kurve2_trials[j] ks_test <- ks.test(Kurve1[[g1]], Kurve2[[g2]], alternative = "greater") result_row <- data.frame( Group1 = g1, Group2 = g2, D_statistic = ks_test$statistic, p_value = ks_test$p.value, stringsAsFactors = FALSE ) ks_results_upper <- rbind(ks_results_upper, result_row) } } }
运行完成后,ks_results_df(或ks_results_upper)就是你需要的结构化数据框,可以直接查看或后续分析使用。
内容的提问来源于stack exchange,提问作者Tom Lawrence
相关产品推荐
相关产品推荐

