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

基于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")))

问题原因

  1. 数据类型不匹配:mval是矩阵类型,不能用[[col]]这种列表索引方式访问列,必须用矩阵的下标语法[,col]。
  2. NA值干扰:meth_deconv存在全NA的列(如TCGA.Y8.A895.01),直接计算min/max会得到NA,后续运算会出错。
  3. 变量名冲突:用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 03:17:08