为多个矩阵分配行名与列名的循环实现问题求助
解决批量给矩阵设置行名列名的问题
我懂你碰到的麻烦了——明明循环逻辑看起来没问题,但就是没法给那些矩阵统一加上行名列名。其实问题出在as.name(i)的用法上,它只是生成一个代表变量名的符号,并不是直接指向你要修改的矩阵对象,所以赋值操作根本没作用到原矩阵上。
给你两种可行的解决方案,推荐第一种,更符合R的编程习惯:
方法一:用列表批量处理(推荐)
当你有大量同类型对象时,把它们放进列表里是最省心的方式,后续不管是修改还是做其他操作都方便:
mnames <- letters[1:10] # 待分配的名称 # 把所有矩阵打包进列表,还能顺便给每个矩阵命名 mat_list <- list( mat1 = matrix(rnorm(100), 10, 10), mat2 = matrix(rnorm(100), 10, 10), mat3 = matrix(rnorm(100), 10, 10) ) # 用lapply批量设置行名列名 mat_list <- lapply(mat_list, function(mat) { rownames(mat) <- mnames colnames(mat) <- mnames mat }) # 如果确实需要把列表里的矩阵放回全局环境(可选操作) list2env(mat_list, envir = .GlobalEnv)
方法二:通过变量名字符串修改全局对象
如果你一定要保留单独的矩阵变量,那可以用get()获取对象,修改后再用assign()存回去:
mnames <- letters[1:10] mat1 <- matrix(rnorm(100),10,10) mat2 <- matrix(rnorm(100),10,10) mat3 <- matrix(rnorm(100),10,10) obs <- c("mat1", "mat2", "mat3") # 原代码里obs写了两个mat2,应该是笔误,我帮你修正了 for(i in obs){ # 先取出对应的矩阵 temp_mat <- get(i) # 设置行名列名 rownames(temp_mat) <- mnames colnames(temp_mat) <- mnames # 把修改后的矩阵存回原变量名 assign(i, temp_mat) }
两种方法都能解决你的问题,但真心建议用列表的方式——矩阵数量越多,这种方式的优势越明显,能避免全局环境乱糟糟的,后续做批量计算、合并操作也更顺手。
内容的提问来源于stack exchange,提问作者Flow
相关产品推荐
相关产品推荐

