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

如何在R函数中使t.test与dplyr group_by/summarise正常工作?

问题解决方案

问题1:配对t检验结果未显示

函数中调用t.test()后,默认不会主动输出结果(除非它是函数的最后一行代码)。解决方法是显式打印结果,或者将其作为返回值的一部分:

# 在函数中添加print输出t检验结果
ttest_res <- t.test(data$before, data$after, paired = TRUE)
print(ttest_res)

如果需要保留结果供后续使用,可以将其放入返回列表中,同时打印确保控制台可见。

问题2:group_by/summarise分组统计结果一致

这个问题几乎都是因为数据格式错误导致的:你的数据大概率是宽格式(包含before和after两列),但直接用宽格式做分组统计时逻辑错误。正确的做法是先将数据转换为长格式,用time_point(before/after)作为分组变量。

修正步骤:

  1. 用tidyr::pivot_longer()将宽格式转长格式:
long_data <- data %>%
  pivot_longer(
    cols = c(before, after),  # 指定要转换的列
    names_to = "time_point",  # 分组变量名
    values_to = "value"       # 指标值列名
  )
  1. 基于长格式数据做分组统计:
summary_stats <- long_data %>%
  group_by(time_point) %>%
  summarise(
    均值 = mean(value, na.rm = TRUE),
    标准差 = sd(value, na.rm = TRUE),
    中位数 = median(value, na.rm = TRUE),
    样本量 = n()
  )

这样分组后,before和after的统计值就会正确区分。

完整修正后的函数示例

library(dplyr)
library(tidyr)
library(ggplot2)

analyze_intervention <- function(data) {
  # 1. 配对t检验(显式打印结果)
  cat("=== 配对t检验结果 ===\n")
  ttest_res <- t.test(data$before, data$after, paired = TRUE)
  print(ttest_res)
  
  # 2. 宽转长格式
  long_data <- data %>%
    pivot_longer(cols = c(before, after),
                 names_to = "time_point",
                 values_to = "index_value")
  
  # 3. 分组汇总统计
  cat("\n=== 干预前后汇总统计 ===\n")
  summary_stats <- long_data %>%
    group_by(time_point) %>%
    summarise(
      n = n(),
      mean = mean(index_value, na.rm = TRUE),
      sd = sd(index_value, na.rm = TRUE),
      median = median(index_value, na.rm = TRUE)
    )
  print(summary_stats)
  
  # 4. 绘制箱线图
  cat("\n=== 生成箱线图 ===\n")
  p <- ggplot(long_data, aes(x = time_point, y = index_value)) +
    geom_boxplot(fill = "#4292c6", alpha = 0.7) +
    labs(title = "干预前后指标对比", x = "时间点", y = "指标值") +
    theme_bw()
  print(p)
  
  # 返回结果(可选)
  return(list(ttest = ttest_res, summary = summary_stats, plot = p))
}

# 测试数据
test_data <- data.frame(
  id = 1:15,
  before = rnorm(15, 40, 5),
  after = rnorm(15, 45, 5)
)

# 调用函数
analyze_intervention(test_data)

关键修正点说明

  • 显式打印t.test()结果,确保控制台输出;
  • 将宽格式数据转为长格式,让group_by()能正确识别before和after两个分组;
  • 统一绘图和统计的数据来源为长格式,避免格式不一致导致的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 11:06:18