如何遍历数据矩阵并对指定行按规则执行除法运算生成新矩阵?
实现方法
当然可以搞定!在R里我们完全不需要繁琐的遍历或者嵌套条件语句,用向量化的方式就能轻松完成这个需求,而且效率更高。下面给你具体的实现步骤和代码:
方法一:向量化运算(推荐)
这种方法利用R的向量广播特性,代码简洁且运行高效,尤其适合处理大矩阵。
首先,我们先还原你给出的matrix1:
# 创建原始矩阵matrix1 matrix1 <- matrix( data = c(1,1,4,1,19,15, 2,1,1,1,1,1, 1,19,15,19,1,4, 18,1,2,1,1,2), nrow = 4, byrow = TRUE, dimnames = list(c("A", "C", "G", "T"), paste0("[,", 1:6, "]")) )
接下来,我们给每个行名指定对应的除数,然后直接对矩阵进行除法运算:
# 定义每行对应的除数:A/T用0.3,C/G用0.2 divisors <- c(A = 0.3, C = 0.2, G = 0.2, T = 0.3) # 计算得到matrix2:自动匹配行名完成对应行的除法 matrix2 <- matrix1 / divisors[rownames(matrix1)]
运行后matrix2就是你需要的结果,R会自动将每行的所有元素除以对应的除数,完全不需要手动循环。
方法二:遍历+条件语句(仅作示例)
如果你确实需要用遍历和条件语句的方式实现,也可以用for循环来完成,但这种方法效率较低,不推荐用于大矩阵:
# 初始化matrix2为原始矩阵的副本 matrix2_loop <- matrix1 # 遍历每一行 for (row_name in rownames(matrix2_loop)) { if (row_name %in% c("A", "T")) { # A和T行除以0.3 matrix2_loop[row_name, ] <- matrix2_loop[row_name, ] / 0.3 } else if (row_name %in% c("C", "G")) { # C和G行除以0.2 matrix2_loop[row_name, ] <- matrix2_loop[row_name, ] / 0.2 } }
两种方法得到的结果是完全一致的,但方法一的向量化运算在代码简洁度和运行效率上都更优。
内容的提问来源于stack exchange,提问作者David_G
相关产品推荐
相关产品推荐

