我注意到,如果 Dataframe 的行名称遵循从1到行数的数字序列。 Dataframe 的行名称将在使用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"
为什么会发生这种情况?
5条答案
按热度按时间chhkpiq41#
可以在应用
as.matrix
时启用rownames = TRUE
vulvrdjw2#
首先也是最重要的,我们总是有一个不会消失的子设置的数字索引,我们不应该与row names 混淆。
使用
rownames
时发生的是base:::rownames()
的宁静源代码中的dimnames
特性,这对于
dimnames(as.matrix(test))[[1]]
产生NULL
,但在dimnames(as.matrix(test[c(1, 3), ]))[[1]]
的情况下产生"1" "3"
。注意,在 Dataframe 的情况下应用方法
base:::row.names.data.frame
,例如rownames(test)
。应该用它来解释什么,幸运的是你没有问为什么,这将是基于观点的。
mrphzbgm3#
“自动”行名称和非“自动”行名称之间存在差异。
下面是一个激励性的例子:
自动
非“自动”
你可以在例如
?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行名。
prdp8dxp4#
dataframe与matrix的区别:
?行名
rownames(x, do.NULL = TRUE, prefix = "row")
重要的部分是
do.NULL = TRUE
,默认值为TRUE:这意味着:如果do.NULL为FALSE,则在任何情况下都返回一个字符向量(长度为NROW(x)或NCOL(x)),
如果在没有任何现有dimname的矩阵上调用替换版本,则它们将添加合适的dimname。
除非x已经有dimname,否则可能不起作用,因为这将从rownames(x)的NULL值创建一个length-3值。
对我来说,这意味着(可能不正确或不专业)将rownames()函数应用于矩阵之前,必须声明行的维度,否则您将获得NULL -〉,因为这是函数rownames()中的默认设置。
在你的例子中,你会经历这样的行为:这里声明了第1行和第3行,并得到1和3
这里不声明任何内容,而是获取NULL,因为NULL是缺省值。
你可以通过在之前声明来克服这个问题:
或者你可以这样做:
与rownames类似的效果。force:rownames.force
指示结果矩阵是否应具有字符(而不是NULL)行名的逻辑。如果数据框具有“自动”行名或零行数据框,则默认值NA使用NULL行名。dimnames(matrix_test)
qvk1mo1f5#
我不知道为什么会发生这种情况,但有一种解决方法是在
as.matrix
中包含参数rownames.force = T