R中创建矩阵时能否使用算术运算及组对比矩阵构建方法
报错根因
你的代码出现报错是括号位置书写错误导致的:你将矩阵填充数据的第四个元素sum(df$Noncases)-df$Noncases[1]写在了c()的外部,导致传入matrix()的data参数只有3个值,同时这个被错放的减法运算结果被识别为nrow参数的取值,最终生成了329行的异常矩阵,触发长度不匹配的警告。
正确构建方案
R的矩阵构建过程完全支持直接嵌套求和、减法等算术运算,只要保证传入data参数的元素数量和nrow*ncol的结果一致即可。
单个分组矩阵构建示例
假设你的数据框df列名为group、case、noncase,对应分组名、病例数、非病例数,以GroupA为例的正确代码如下:
# 提前计算全局总病例、总非病例,避免重复计算 total_case <- sum(df$case) total_noncase <- sum(df$noncase) # 取第1行的GroupA构建2×2矩阵 target_idx <- 1 groupA_mat <- matrix( data = c( df$case[target_idx], df$noncase[target_idx], total_case - df$case[target_idx], total_noncase - df$noncase[target_idx] ), nrow = 2, ncol = 2, dimnames = list( 疾病分类 = c("病例", "非病例"), 分组 = c(df$group[target_idx], paste0("非", df$group[target_idx])) ) ) |> as.table()
多分组批量生成方案
如果分组数量较多,可以用lapply批量生成所有分组的对照矩阵,无需手动逐个计算:
total_case <- sum(df$case) total_noncase <- sum(df$noncase) # 批量生成所有分组的对照矩阵,存储为列表 all_group_mat <- lapply(1:nrow(df), function(i){ mat <- matrix( data = c( df$case[i], df$noncase[i], total_case - df$case[i], total_noncase - df$noncase[i] ), nrow = 2, dimnames = list( 疾病分类 = c("病例", "非病例"), 分组 = c(df$group[i], paste0("非", df$group[i])) ) ) return(as.table(mat)) }) # 给列表按分组名命名,方便后续调用 names(all_group_mat) <- df$group # 调用示例:提取GroupB的矩阵 all_group_mat$GroupB # 调用示例:对GroupC做Fisher精确检验 fisher.test(all_group_mat$GroupC)
补充说明
如果需要自动根据样本量选择卡方检验或Fisher精确检验,可以加简单的判断逻辑:当矩阵中期望频数小于5的单元格占比超过20%,或者有期望频数小于1时,自动用Fisher精确检验,否则用卡方检验。
内容的提问来源于stack exchange,提问作者gbg
相关产品推荐
相关产品推荐

