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

R语言对数据框每行执行chisq.test并输出结果到新数据框的实现方法

你之前的代码存在两个问题:

  1. 直接将4个数值的向量传入chisq.test(),函数默认执行的是拟合优度检验,而非你需要的2×2列联表独立性检验,需要先将每行的4个值转为2行2列的矩阵
  2. 没有从返回的htest检验对象中提取你需要的卡方值和p值,导致返回的是检验对象列表无法直接合并到原数据框

基础R实现方案

# 对指定四列逐行执行卡方检验
test_result <- t(apply(DF1[, c('female_boxing','female_cycling','male_boxing','male_cycling')], 1, function(x) {
  # 将行的4个值转为2×2列联表矩阵,行对应性别,列对应运动类型
  cont_table <- matrix(x, nrow = 2, byrow = TRUE)
  # 执行卡方检验,可根据需求调整correct参数控制是否启用连续性校正
  chi_res <- chisq.test(cont_table)
  # 返回需要的两个指标
  return(c(X_squared = chi_res$statistic, p_value = chi_res$p.value))
}))

# 将检验结果合并到原数据框
DF1 <- cbind(DF1, test_result)

Tidyverse风格实现方案

如果你习惯用dplyr、purrr套件,可以用如下写法:

library(dplyr)
library(purrr)

DF1 <- DF1 %>%
  rowwise() %>%
  mutate(
    # 生成2×2列联表
    cont_table = list(matrix(c(female_boxing, female_cycling, male_boxing, male_cycling), nrow = 2, byrow = TRUE)),
    # 提取卡方值和p值
    X_squared = chisq.test(cont_table)$statistic,
    p_value = chisq.test(cont_table)$p.value
  ) %>%
  ungroup() %>%
  select(-cont_table) # 移除中间生成的列联表列

如果你的样本量较小预期理论频数低于5,也可以把chisq.test替换为fisher.test执行Fisher精确检验,提取p值的逻辑完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:45:04