基于meth_deconv对mval执行min-max归一化时出现下标越界错误
问题:基于另一个DataFrame的min-max归一化报错“subscript out of bounds”
问题背景
有两个列名相同但行数据不同的数据集:mval和meth_deconv,想要基于meth_deconv的数值对mval执行min-max归一化,运行代码后触发下标越界错误。
报错代码
common.cols <- intersect(colnames(mval), colnames(meth_deconv)) meth_deconv <- meth_deconv[,common.cols] mval <- mval[,common.cols] bval <- bval[,common.cols] for (col in colnames(mval)) { min <- min(meth_deconv[[col]]) max <- max(meth_deconv[[col]]) mval[[col]] <- (mval[[col]] - min) / (max - min) }
报错信息
> for (col in colnames(mval)) { + min <- min(meth_deconv[[col]]) + max <- max(meth_deconv[[col]]) + mval[[col]] <- (mval[[col]] - min) / (max - min) + } Error in mval[[col]] : subscript out of bounds
样本数据
meth_deconv 样本
> dput(meth_deconv[1:5,1:5]) structure(list(TCGA.Y8.A8RZ.01 = c(0.129859982131871, 0.0357708166456001, 0, 0.133656384812674, 0.0666114231385833), TCGA.Y8.A8RY.01 = c(0.114822027432518, 0.0182327682610597, 0, 0.154950359997823, 0.0170537545658276), TCGA.Y8.A897.01 = c(0.0733882956002282, 0.0156764793850076, 0, 0.142084581990467, 0.0464498830958926), TCGA.Y8.A896.01 = c(0.105826996952733, 0.0298500219688853, 0, 0.139574516141476, 0.0352706140819193 ), TCGA.Y8.A895.01 = c(NA_real_, NA_real_, NA_real_, NA_real_, NA_real_)), row.names = c("Bcell", "CD8", "Dendritic", "Endo", "Eos"), class = "data.frame")
mval 样本
> dput(mval[1:5,1:5]) structure(c(2.20666978271644, 2.21762842677891, -4.07494124222421, -4.13722707002192, -3.43314164549568, 2.33449419612022, 2.34788404801465, -3.75292484979324, -4.3115910063775, -4.31229291319228, 2.54516913102614, 3.15809412595788, -2.12378973913844, -4.35973967501755, -4.39347889615609, 2.14840959318955, 1.81982095876368, -3.46795103846624, -4.29965006722576, -4.40595273662642, 2.66361259477239, 2.62697164963472, -1.88151767905837, -4.13446638546434, -4.09928030669639), dim = c(5L, 5L), dimnames = list( c("cg00000957", "cg00001349", "cg00001583", "cg00002028", "cg00002719"), c("TCGA.Y8.A8RZ.01", "TCGA.Y8.A8RY.01", "TCGA.Y8.A897.01", "TCGA.Y8.A896.01", "TCGA.Y8.A895.01")))
问题原因
- 数据类型不匹配:
mval是矩阵类型,不能用[[col]]这种列表索引方式访问列,必须用矩阵的下标语法[,col]。 - NA值干扰:
meth_deconv存在全NA的列(如TCGA.Y8.A895.01),直接计算min/max会得到NA,后续运算会出错。 - 变量名冲突:用
min/max作为变量名,覆盖了R内置的同名函数,可能引发意外逻辑错误。
解决方法
修正后的代码
common.cols <- intersect(colnames(mval), colnames(meth_deconv)) meth_deconv <- meth_deconv[, common.cols, drop = FALSE] # 将矩阵mval转为DataFrame,统一索引方式 mval <- as.data.frame(mval[, common.cols, drop = FALSE]) # 若bval未定义则删除该行,避免报错 # bval <- bval[,common.cols] for (col in colnames(mval)) { # 跳过全NA的列 if (all(is.na(meth_deconv[[col]]))) next # 自定义变量名避免覆盖内置函数,同时忽略NA值 col_min <- min(meth_deconv[[col]], na.rm = TRUE) col_max <- max(meth_deconv[[col]], na.rm = TRUE) # 处理最大值等于最小值的情况,防止除以0 if (col_max == col_min) { mval[[col]] <- 0 } else { mval[[col]] <- (mval[[col]] - col_min) / (col_max - col_min) } }
关键修改说明
- 将
mval转换为DataFrame,统一使用[[col]]的索引方式;若需保留矩阵类型,可将mval[[col]]替换为mval[, col]。 - 增加全NA列的判断,跳过无效列。
- 使用
na.rm = TRUE忽略NA值,确保min/max计算有效。 - 重命名变量为
col_min/col_max,避免覆盖内置函数。 - 增加最大值等于最小值的判断,防止除以0的错误。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

