矩阵下标数量错误:R语言合并列表创建矩阵报错求助
解决矩阵下标错误的问题
错误原因分析
你遇到的incorrect number of subscripts on matrix错误主要有两个根源:
- 向量与二维对象的混淆:
huh <- as.double(read_excel(...))把单列的data.frame转换成了向量,而向量没有nrow()属性——nrow(huh)会返回NULL。这时候你创建的matrix(nrow=nrow(huh),ncol=4)实际上是一个一维矩阵(R会默认按列数生成长度为4的一维结构),后续用df[i,1]这种二维下标访问就会触发下标数量不匹配的错误。 - 列下标越界:
snu <- read_excel("RNA.xlsx", range = "AGS3:AGS56321")读取的是单列data.frame,你代码里用snu[i,4]访问第4列,显然超出了该数据框的列数范围,这也是一个潜在的报错点。
修正后的代码方案
推荐优先使用data.frame来存储混合类型(字符+数值)的数据,比矩阵更适合这类场景:
library(readxl) # 方案1:一次性读取所有需要的区域,更高效 full_data <- read_excel("RNA.xlsx", range = "A3:AGS56321") df <- data.frame( gene_id = full_data[[1]], # 对应A列的基因ID gene_name = full_data[[2]], # 对应B列的基因名 huh = as.integer(full_data[["LX"]]), # 对应LX列的huh样本数据 snu = as.integer(full_data[["AGS"]]) # 对应AGS列的snu样本数据 ) # 方案2:分步读取(如果你坚持原来的拆分方式) genes <- read_excel("RNA.xlsx", range = "A3:B56321") # 读取单列时用[[1]]提取向量,避免data.frame与向量混用 huh_vec <- as.double(read_excel("RNA.xlsx", range = "LX3:LX56321")[[1]]) snu_vec <- as.double(read_excel("RNA.xlsx", range = "AGS3:AGS56321")[[1]]) # 用向量的length()获取行数,创建data.frame df <- data.frame( gene_id = genes[[1]], gene_name = genes[[2]], huh = as.integer(huh_vec), snu = as.integer(snu_vec) )
额外建议
- 矩阵仅适合存储单一数据类型的集合,如果你非要用矩阵存储当前的混合类型数据,所有元素会被强制转换成字符,后续数值分析会非常麻烦,因此不推荐。
- 读取单列数据时,尽量用
[[1]]直接提取向量,这样可以用length()获取元素个数,而nrow()仅适用于data.frame、矩阵这类二维对象。
内容的提问来源于stack exchange,提问作者Yajas
相关产品推荐
相关产品推荐

