在R语言中提取矩阵每行非零值生成指定尺寸矩阵的方法
在R中提取矩阵每行的非零值(固定数量)
刚好你每行的非零元素数量都是固定的16个,这让处理变得简单很多,下面给你几种实用的实现方法:
方法一:使用apply逐行处理(直观易懂)
这是最直观的方式,用apply函数遍历矩阵的每一行,提取其中的非零元素,最后转置得到目标矩阵:
# 提取每行非零值并转置 output_matrix <- t(apply(input_matrix, 1, function(row) row[row != 0]))
解释:
apply(input_matrix, 1, ...):参数1表示按行处理矩阵,对每一行执行后面的匿名函数row[row != 0]:筛选出当前行中不等于0的元素t():因为apply返回的结果是列向量组成的矩阵,转置后才能让每行对应原矩阵的一行非零值
方法二:向量化索引(效率更高)
如果你的矩阵规模较大,向量化操作比逐行循环(apply本质是底层循环)速度更快。利用矩阵的索引特性直接提取所有非零元素,再重新塑形:
# 提取所有非零元素 all_non_zero <- input_matrix[input_matrix != 0] # 重新排列成31行16列的矩阵,按行填充 output_matrix <- matrix(all_non_zero, nrow = 31, ncol = 16, byrow = TRUE)
解释:
input_matrix[input_matrix != 0]:直接提取矩阵中所有非零元素,返回一个一维向量matrix(..., byrow = TRUE):因为原矩阵每行恰好16个非零元素,按行填充就能完美对应原行的非零值顺序
测试验证(小例子)
可以用一个迷你矩阵验证方法是否正确:
# 构造测试矩阵:3行6列,每行2个非零值 test_mat <- matrix(c(5,0,4,0,4,0, 1,0,0,0,2,0, 0,3,0,5,0,6), nrow = 3, byrow = TRUE) # 方法一测试 result1 <- t(apply(test_mat, 1, function(x) x[x != 0])) # 方法二测试 result2 <- matrix(test_mat[test_mat != 0], nrow = 3, ncol = 2, byrow = TRUE) # 打印结果,两种方法输出一致 print(result1) # [,1] [,2] # [1,] 5 4 # [2,] 1 2 # [3,] 3 5
内容的提问来源于stack exchange,提问作者Jose Ramon
相关产品推荐
相关产品推荐

