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

wfypjpf4  于 2023-06-03  发布在  其他
关注(0)|答案(5)|浏览(289)

我注意到,如果dataframe的行名称遵循从1到行数的数字序列。使用as.matrix后, Dataframe 的行名称将消失。但如果行名称不是序列,则会重新显示行名称。
下面是一个可重复的示例:

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"

为什么会发生这种情况?

yizd12fk

yizd12fk1#

可以在应用as.matrix时启用rownames = TRUE

> as.matrix(test, rownames = TRUE)
    x   y
1 0.1 0.1
2 0.1 0.2
3 1.0 0.3
yx2lnoni

yx2lnoni2#

首先也是最重要的,我们总是有一个不会消失的子设置的数字索引,我们不应该与row names 混淆。

as.matrix(test)[c(1, 3), ]
#        x   y
# [1,] 0.1 0.1
# [2,] 1.0 0.3

使用rownames时发生的是base:::rownames()的宁静源代码中的dimnames特性,

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()
  }
}

这对于dimnames(as.matrix(test))[[1]]产生NULL,但在dimnames(as.matrix(test[c(1, 3), ]))[[1]]的情况下产生"1" "3"
注意,方法base:::row.names.data.frame应用于 Dataframe 的情况,例如rownames(test)
应该用它来解释什么,幸运的是你没有问为什么,这将是基于观点的。

camsedfj

camsedfj3#

“automatic”和非“automatic”行名称之间存在差异。
下面是一个激励性的例子:

自动

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

非“自动”

test1 <- test
rownames(test1) <- as.character(1:3)
rownames(test1)
# [1] "1" "2" "3"

rownames(as.matrix(test1))
# [1] "1" "2" "3"

您可以在例如中阅读此内容。?data.frame,其中提到了您在最后发现的行为:
如果row.names被提供为NULL或没有找到合适的组件,则行名称是从1开始的整数序列(并且这样的行名称被认为是“自动”的,并且不被as.matrix保留)。
当你调用test[c(1, 3), ]时,你会隐式地创建非“自动”的行名,这在?Extract.data.frame中有记录:
如果[返回一个数据框,它将具有唯一的(且不丢失)行名称。
(type [.data.frame到您的控制台,如果您想在这里深入了解。)
其他人已经展示了这对您的情况意味着什么,请参阅?matrix中的参数rownames.force
rownames.force:...如果数据框具有“自动”行名或对于零行数据框,则默认值NA使用NULL行名。

rpppsulh

rpppsulh4#

dataframe与矩阵:
?行名
rownames(x, do.NULL = TRUE, prefix = "row")
重要的部分是do.NULL = TRUE,默认值为TRUE:这意味着:
如果do.NULL为FALSE,则在任何情况下都返回一个字符向量(长度为NROW(x)或NCOL(x)),
如果在没有任何现有dimname的矩阵上调用替换版本,它们将添加合适的dimname。但结构如

rownames(x)[3] <- "c"

除非x已经有dimnames,否则可能无法工作,因为这将从rownames(x)的NULL值创建长度为3的值。
对我来说,这意味着(可能不正确或不专业)将rownames()函数应用于矩阵之前,必须声明行的维度,否则您将获得NULL ->,因为这是函数rownames()中的默认设置。
在你的例子中,你会经历这样的行为:这里声明了第1行和第3行,并得到1和3

rownames(as.matrix(test[c(1, 3), ]))
[1] "1" "3"

这里你什么都不声明,得到的是NULL,因为NULL是默认值。

rownames(as.matrix(test))
NULL

你可以通过在之前声明来克服这个问题:

rownames(test) <- 1:3

rownames(as.matrix(test))
[1] "1" "2" "3"

或者你可以这样做:

rownames(as.matrix(test), do.NULL = FALSE)
[1] "row1" "row2" "row3"
> rownames(as.matrix(test), do.NULL = FALSE, prefix="")
[1] "1" "2" "3"

与rownames类似的效果。force:rownames.force
指示结果矩阵是否应具有字符(而不是NULL)行名的逻辑。如果数据框具有“自动”行名或对于零行数据框,则默认值NA使用NULL行名。dimnames(matrix_test)

ewm0tg9j

ewm0tg9j5#

我不知道为什么会发生这种情况,但有一种解决方法是在as.matrix中包含参数rownames.force = T

rownames(as.matrix(test, rownames.force = T))

相关问题