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

R函数计算最大标准化残差后返回向量类型不符问题排查

问题描述

我有如下测试数据:

test_data <- as.data.frame(list(
  Drugs = c(1, 2, 2, 2, 1, 2, 2, 3, 2, 2, 2, 2, 2, 2, 1, 3, 2, 1, 1, 2, 3, 3, 2, 3, 1, 2, 2, 2, 2, 2, 3, 3, 2, 2, 2, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 3, 1, 3, 1, 1, 2, 1, 2, 2, 1, 3, 1, 1, 3, 3, 2, 1, 3, 2, 2, 3, 1, 3, 2, 1, 2, 3, 1, 2, 3, 2, 1, 3, 1, 2, 3, 3, 2, 3, 2, 2, 2, 3, 1, 2, 2, 3),
  Result = c(1, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 1, 2, 2, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 2, 1, 1, 1, 2, 2, 1, 2, 2, 1, 2, 2, 2, 1, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, 1, 1, 2, 2, 1, 1, 2, 1, 2, 2, 1, 2, 1, 1, 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 2, 1, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1, 1, 1, 1, 2, 2, 1)
))

我编写了一个函数,用于计算卡方检验的最大标准化残差后返回对应的分类字符串向量。本地运行时返回的是字符串向量,但平台提示返回的是整数向量,我对此感到困惑。函数代码如下:

maxre <- function(x){
  x$Drugs <- factor(x$Drugs, labels = c('drug_1', 'drug_2','drug_3'))
  x$Result <- factor(x$Result, labels = c('negative', 'positive'))
  zz <- table(x)
  res <- chisq.test(zz)
  tab <- res$stdres
  tab <- as.data.frame(tab)
  tab$Drugs <- factor(tab$Drugs, labels = c('drug_1', 'drug_2','drug_3'))
  tab$Result <- factor(tab$Result, labels = c('negative', 'positive'))
  tab2 <- as.data.frame(tab)
  maximal <- max(tab2$Freq)
  interm <- tab[tab$Freq == maximal,]
  result <- c(interm[1, 1], interm[1, 2])
  result <- as.vector(result)
  return(result)
}

预期输出应为:

[1] "drug_3"   "negative"
问题分析与修正

你的函数中存在冗余操作:将res$stdres转为数据框后,重复对Drugs和Result列进行因子标签转换,这一步完全没必要——因为res$stdres的行、列名已经是之前转换后的字符串型因子水平,再次转因子可能在特定环境下导致平台提取因子的内部整数编码,而非显示的标签。

简化并修正后的函数如下:

maxre <- function(x){
  # 将原始数值转为带标签的因子
  x$Drugs <- factor(x$Drugs, labels = c('drug_1', 'drug_2','drug_3'))
  x$Result <- factor(x$Result, labels = c('negative', 'positive'))
  
  # 生成列联表并计算卡方检验
  zz <- table(x)
  res <- chisq.test(zz)
  
  # 提取标准化残差转为数据框
  tab <- as.data.frame(res$stdres)
  
  # 定位最大标准化残差对应的行
  max_stdres <- max(tab$Freq)
  interm <- tab[tab$Freq == max_stdres, ]
  
  # 提取分类标签并转为字符串向量
  result <- as.character(c(interm[1, 1], interm[1, 2]))
  return(result)
}
验证结果

运行修正后的函数:

maxre(test_data)

输出结果:

[1] "drug_3"   "negative"

完全符合预期,且返回的是标准字符串类型向量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:03:18