R语言按不同类别分组对比两时间段差异的t-test实现问询
R实现分类别t检验方案
前置修正
你提供的示例数据集存在语法错误,修正后可直接运行的版本如下:
Dataset <- data.frame( category = c("tools", "finance", "business", "education","tools","education"), number_trackers = c(10, 12, 1, 30, 7, 21), c4 = c("url1.com","ur2.com","url3.com","url4.com","url5.com","url6.com"), time = c(1,0,0,0,1,1) )
注:示例数据中
finance、business类别仅存在time=0的观测,没有时间对比的基础,运行检验代码时会自动跳过这两类,仅返回tools、education的检验结果。
方案1:tidyverse生态实现(输出结果规整易读)
适合需要批量整理检验结果、后续需要做可视化或表格输出的场景:
# 首次使用先安装依赖包 install.packages(c("dplyr", "purrr", "broom")) # 加载包 library(dplyr) library(purrr) library(broom) # 分类别执行t检验 t_test_result <- Dataset %>% group_by(category) %>% # 过滤掉只有单时间点观测、无法做对比的类别 filter(n_distinct(time) == 2) %>% nest() %>% # 对每个类别的数据独立执行t检验 mutate(t_test = map(data, ~t.test(number_trackers ~ time, data = .x))) %>% # 整理检验结果为结构化表格 mutate(result = map(t_test, tidy)) %>% unnest(result) %>% select(category, estimate, statistic, p.value, conf.low, conf.high, method) # 查看最终结果 View(t_test_result)
结果中p.value列即为对应类别的显著性值,小于你设定的显著性水平(通常为0.05)即可认为特定日期前后的number_trackers存在显著差异。
方案2:base R实现(无需依赖第三方包)
适合不想安装额外包的轻量使用场景:
# 提取所有唯一类别 all_categories <- unique(Dataset$category) # 初始化结果存储列表 t_test_res <- list() for (cat in all_categories) { sub_data <- Dataset[Dataset$category == cat, ] # 跳过只有单时间点的类别 if (length(unique(sub_data$time)) != 2) { t_test_res[[cat]] <- "仅单时间点观测,无法执行t检验" next } # 执行t检验 t_test_res[[cat]] <- t.test(number_trackers ~ time, data = sub_data) } # 打印所有检验结果 print(t_test_res)
注意事项
- 若你的数据为配对设计(同一观测主体在日期前后均有对应记录),可在
t.test()中添加参数paired = TRUE使用配对t检验 - 若检验前验证过两组方差齐性,可添加参数
var.equal = TRUE提升检验效能
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

