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
相关产品推荐
相关产品推荐

