如何在R中展开检验生成的dataframe?解决unnest报错问题
问题分析与解决方案
两个核心问题:
- shap函数逻辑错误:你在
filter之后没有把结果赋值给变量,导致shapiro.test始终用的是原始全量的df$difference,根本没用到过滤后的子集。 - unnest无法直接处理htest对象:
shapiro.test返回的是<htest>类型的对象,不是tidy格式的列表/数据框,直接用unnest会触发类型不匹配的报错。
修正步骤:
1. 修复shap函数的过滤逻辑
把过滤后的结果赋值给临时变量,再传入Shapiro检验:
shap <- function(t) { df_filtered <- df %>% filter(test == t) shapiro.test(df_filtered$difference) }
2. 用broom::tidy()将htest对象转为整洁数据框
broom包的tidy()函数可以把假设检验的结果转换成标准的tidy数据框,完美适配tidyverse的嵌套/展开逻辑。
完整简化代码(一步到位):
library(tidyverse) library(broom) # 需加载broom包 df <- tibble(id = c(1,2,3,4,5,6,7,8), test = c(2,1,2,1,2,1,2,1), difference = c(1,3,4,7,3,9,3,7)) shap <- function(t) { df_filtered <- df %>% filter(test == t) shapiro.test(df_filtered$difference) %>% tidy() # 直接转为整洁数据框 } test <- 1:2 # 用map_dfr直接合并结果,无需enframe+unnest res <- map_dfr(test, shap, .id = "test") res
如果你坚持使用enframe+unnest流程:
可以先保留htest对象,再在unnest前转换格式:
res <- map(test, shap) res2 <- enframe(res, name = "test", value = "htest") res3 <- res2 %>% mutate(htest = map(htest, tidy)) %>% unnest(cols = htest) res3
运行结果示例:
# A tibble: 2 × 5 test statistic p.value method alternative <chr> <dbl> <dbl> <chr> <chr> 1 1 0.972 0.936 Shapiro-Wilk normality test two.sided 2 2 0.957 0.852 Shapiro-Wilk normality test two.sided
内容的提问来源于stack exchange,提问作者sbac
相关产品推荐
相关产品推荐

