如何让单行矩阵按列取子集时返回带行名的向量?
解决单行矩阵按列取子集保留行名的问题
先看你的示例矩阵:
lil_matrix <- matrix(data = 1:4, nrow = 2, dimnames = list(c("Row1", "Row2"), c("Col1", "Col2")))
正常多行列矩阵按列取子集(lil_matrix[,1])会返回带行名的向量,但单行矩阵(比如lil_matrix[1, , drop = FALSE])按列取子集时,默认返回的向量会丢失行名。要高效实现保留行名的需求,有几种简洁的方法:
方法1:先存单行矩阵再赋值行名
先把单行矩阵存入变量,避免重复计算,然后给结果向量添加行名:
# 先获取单行矩阵 single_row <- lil_matrix[1, , drop = FALSE] # 取列子集并添加行名 named_vec <- single_row[,1] names(named_vec) <- rownames(single_row)
这种方法清晰直观,且因为只生成一次单行矩阵,效率较高。
方法2:用c()转换单行单列矩阵(最高效)
直接取单行单列的矩阵(保留维度),再用c()转换为向量,c()会自动保留原矩阵的行名作为向量名称:
named_vec <- c(lil_matrix[1, 1, drop = FALSE])
这个操作完全基于基础R的原生函数,没有额外开销,是效率最高的方案。测试结果如下:
> named_vec Row1 1
完全符合需求。
方法3:用setNames一步完成
如果不想拆分步骤,可以用setNames直接给结果向量绑定行名,注意只生成一次单行矩阵来提升效率:
single_row <- lil_matrix[1, , drop = FALSE] named_vec <- setNames(single_row[,1], rownames(single_row))
内容的提问来源于stack exchange,提问作者nateroe
相关产品推荐
相关产品推荐

