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

如何在R中展开检验生成的dataframe?解决unnest报错问题

问题分析与解决方案

两个核心问题:

  1. shap函数逻辑错误:你在filter之后没有把结果赋值给变量,导致shapiro.test始终用的是原始全量的df$difference,根本没用到过滤后的子集。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 16:40:33