R语言对数据框每行执行chisq.test并输出结果到新数据框的实现方法
你之前的代码存在两个问题:
- 直接将4个数值的向量传入
chisq.test(),函数默认执行的是拟合优度检验,而非你需要的2×2列联表独立性检验,需要先将每行的4个值转为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
相关产品推荐
相关产品推荐

