将 as.vector 应用于矩阵切片时保留列名

Posted

技术标签:

【中文标题】将 as.vector 应用于矩阵切片时保留列名【英文标题】:keep column names when applying as.vector to a matrix slice 【发布时间】:2014-09-12 18:25:49 【问题描述】:

假设我有一个矩阵,

A = matrix(c(1,23,4,5,6,3,2,2,1,2), nrow = 2, ncol = 5)

行名和列名由,

rownames(A) = c('row1', 'row2')
colnames(A) = c('es', 'one', 'column', 'no', '5')

如果我这样做:

> my.slice = A[1,,drop=FALSE]
    es    one column     no      5 
     1      4      6      2      1 

我仍然看到列名。但如果我这样做:

> my.slice = as.numeric(A[1,,drop=FALSE])
[1] 1 4 6 2 1

我丢失了列名,实际上都是数字类。

有没有办法做 as.vector 并保留列名?或者更一般地,将矩阵切片为具有名称(my.slice)= colnames(A)的数值类向量?

注意(小故事)。这一切都是从我将默认设置为 drop=FALSE 开始的。然后我需要在对矩阵进行切片时使用 as.vector,但遗憾的是现在我丢失了 my.slice 中元素的名称。

【问题讨论】:

is.vector(A[1,]) 返回TRUE,主要是因为[ 默认设置了drop=TRUE。试试dput(A[1,]) 你会发现它只是一个带有一些名字的向量。 @thelatemail 谢谢。这是一个很好的答案,但我正在寻找一个简短的答案,让我留在数字类中,因为我的所有代码都内置在该类的操作中。 数字 - is.numeric(A[1,]) == TRUE 那就别那样做了。覆盖默认值是整理代码的一流方法。 @Dnaiel:不要更改默认值,它可能会破坏所有依赖正常行为的包。不要这样做,兄弟。特别是如果我们只需要漂亮的打印。保留默认行为,改为编写格式化函数。 【参考方案1】:

您可以将矩阵转换为数据框,对其进行切片,然后使用unlist 将切片变​​成命名向量:

B <- as.data.frame(A)

my.slice <- unlist(B[1,])

只要列名不包含奇怪字符,此方法就有效:数据框的列名在语法上必须作为变量名是可接受的,因此它们不能以数字或标点符号开头。

【讨论】:

【参考方案2】:

使用setNames:

(my.slice = setNames(A[1,], colnames(A)))
es    one column     no      5 
 1      4      6      2      1 

class(my.slice)
[1] "numeric"

【讨论】:

以上是关于将 as.vector 应用于矩阵切片时保留列名的主要内容,如果未能解决你的问题,请参考以下文章

切片时返回错误索引值的数据类型

在R中对大矩阵进行排序

r:将 matrix.csr 转换为矩阵。 as.vector(data) 中的错误

在@Input 上使用切片时调用了两次组件的设置器。角度 4

切片时的 if 语句

如何将 pandas udf 应用于大型矩阵数据框