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

R语言中如何提取稀疏矩阵非零元素向量并自定义行列名格式

问题:提取矩阵非零元素并自定义向量名称

假设已有如下R语言定义的矩阵:

mat <- matrix(data = c(1, 2, 3, 0, 0, 0, 0, 0, 0, 
                       0, 0, 0, 2, 3, 4, 0, 0, 0,
                       0, 0, 0, 0, 0, 0, 5, 6, 7),
              nrow = 9, 
              dimnames = list(c(paste0("x", 1:3),
                                paste0("y", 1:3),
                                paste0("z", 1:3)),
                              c("a", "b", "c")))

矩阵输出结果:

a b c
x1 1 0 0
x2 2 0 0
x3 3 0 0
y1 0 2 0
y2 0 3 0
y3 0 4 0
z1 0 0 5
z2 0 0 6
z3 0 0 7

当前使用以下代码提取非零元素,但仅保留了行名:

red <- apply(mat, 1, function(x) x[x != 0])

输出结果:

x1 x2 x3 y1 y2 y3 z1 z2 z3 
 1  2  3  2  3  4  5  6  7 

期望提取非零元素为向量,且向量名称采用「列名=行名」的格式,输出如下:

a=x1 a=x2 a=x3 b=y1 b=y2 b=y3 c=z1 c=z2 c=z3 
 1    2    3    2    3    4    5    6    7 

注:预先不知道矩阵的行列数量及命名规则。


解决方案

方法1:基础R实现(通用无依赖)

通过定位非零元素的行列位置,构造自定义名称后生成目标向量,完全适配任意有行列名的矩阵:

# 获取非零元素的行列索引
non_zero_pos <- which(mat != 0, arr.ind = TRUE)
# 提取非零元素值
values <- mat[non_zero_pos]
# 构造「列名=行名」格式的向量名称
names(values) <- paste(colnames(mat)[non_zero_pos[, "col"]], 
                       rownames(mat)[non_zero_pos[, "row"]], 
                       sep = "=")
# 查看结果
values

运行后输出:

a=x1 a=x2 a=x3 b=y1 b=y2 b=y3 c=z1 c=z2 c=z3 
 1    2    3    2    3    4    5    6    7 

方法2:tidyverse工具链实现(可选)

如果习惯使用tidyverse系列包,可通过数据格式转换完成需求:

library(tidyverse)

mat %>%
  as.data.frame() %>%
  rownames_to_column(var = "row_name") %>%
  pivot_longer(cols = -row_name, names_to = "col_name", values_to = "value") %>%
  filter(value != 0) %>%
  mutate(name = paste(col_name, row_name, sep = "=")) %>%
  select(name, value) %>%
  deframe()

运行结果与方法1一致,适合熟悉tidyverse语法的用户。


内容的提问来源于stack exchange,提问作者user321797

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 13:54:37