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
相关产品推荐
相关产品推荐

