在对矩阵使用sapply时保留列名和行名

6
在应用applysapply等函数时,如何在矩阵中保留列名已经有人提出了一个问题, 链接在这里
但是我没有找到如何保留矩阵的列行名称。以下是一个示例:
mat = matrix(c(as.character(1:4)), nrow = 2)
colnames(mat) = c( 'col1', 'col2' )
rownames(mat) = c( 'row1', 'row2' )
mat = apply(mat,  2,  function(x) as.numeric(paste(x)))
colnames(mat)
rownames(mat)

感谢提前预先谢谢 :-)

这个问题及其答案可能值得一看。 - Humpelstielzchen
3个回答

5

我们可以将您的应用程序封装在一个用户定义函数中。

mat_fun <- function(m){
  m2 <- apply(m,  2,  function(x) as.numeric(paste(x)))
  colnames(m2) <- colnames(m)
  rownames(m2) <- rownames(m)
  return(m2)
}

mat_fun(mat)
#      col1 col2
# row1    1    3
# row2    2    4

1
非常聪明!他必须思考。非常感谢你;-) - Flora Grappelli

2
如果使用[]重新分配,则名称将被保留。不幸的是,当您不想创建新矩阵且不想更改元素的类别(例如,在此示例中从字符更改为数字)时,这仅在您不想创建新矩阵时有用。
mat[] <- apply(mat,  2,  function(x) 1 + as.numeric(paste(x)))
mat
#      col1 col2
# row1 "2"  "4" 
# row2 "3"  "5" 

感谢您的精准指导。这种方法在某些操作中可能非常有用。 - Flora Grappelli

0

根据@Humpelstielzchen的评论,这是我的另一种选择:

mat = apply(mat, 2, function(x) setNames(as.numeric(paste(x)), names(x)))

基本上,由于apply是以逐行方式工作的(即,每一行被单独地视为一个向量),我们必须根据我们创建的向量来命名我们的新向量...而为此,setNames是一个非常好的选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接