为什么行名称在 as.matrix 之后消失?

Ton*_*Qiu 5 r matrix dataframe r-rownames

我注意到,如果数据帧的行名称遵循从 1 到行数的数字序列。使用 后,数据框的行名称将消失as.matrix。但如果行名称不是序列,则行名称会重新出现。

这是一个可重现的示例:

test <- as.data.frame(list(x=c(0.1, 0.1, 1), y=c(0.1, 0.2, 0.3)))
rownames(test)
# [1] "1" "2" "3"

rownames(as.matrix(test))
# NULL

rownames(as.matrix(test[c(1, 3), ]))
# [1] "1" "3"
Run Code Online (Sandbox Code Playgroud)

为什么会出现这种情况?

jay*_*.sf 3

首先也是最重要的,我们总是有一个不会消失的子设置数字索引,并且我们不应该与行名称混淆

as.matrix(test)[c(1, 3), ]
#        x   y
# [1,] 0.1 0.1
# [2,] 1.0 0.3
Run Code Online (Sandbox Code Playgroud)

使用时发生的事情rownamesdimnamesSerene 源代码中的功能base:::rownames()

function (x, do.NULL = TRUE, prefix = "row") 
{
  dn <- dimnames(x)
  if (!is.null(dn[[1L]])) 
    dn[[1L]]
  else {
    nr <- NROW(x)
    if (do.NULL) 
      NULL
    else if (nr > 0L) 
      paste0(prefix, seq_len(nr))
    else character()
  }
}
Run Code Online (Sandbox Code Playgroud)

NULL的情况下产生,但在 的情况下dimnames(as.matrix(test))[[1]]产生。"1" "3"dimnames(as.matrix(test[c(1, 3), ]))[[1]]

请注意,该方法base:::row.names.data.frame适用于数据帧的情况,例如rownames(test)

应该用它来解释什么,幸运的是你没有问为什么,这将是基于意见的。