是否有一个函数可以确定data.frame是否具有本机行名称和列名或仅具有自动生成的行名称和列名(1 2 3 4...)?对于列名,“automatically”表示例如当您将“as.data.frame”应用于矩阵时。
对于行名称,我想出了一个解决方法:
has.row.names = function(df) {
!all(row.names(df)==seq(1, nrow(df)))
}
然而,对于列名,我不知道如何做到这一点。困难的是,有时自动col。名称开始与V1 V2等,有时与X1。,X2。
为什么我问这个问题:我需要在一个更复杂的函数中执行这个测试(有点类似于PCA的图形输出),如果存在,它将绘制行名称和列名,如果不存在,它将创建更合适的新名称。所以它应该适用于“任何”data.frame,没有实际名称的线索。
2条答案
按热度按时间jexiocij1#
**简短版本:**只有当属性“names”为NULL时, Dataframe 才会没有列名。因此,检查 Dataframe 中是否存在列名的简单方法如下所示。
**扩展版本:**行名可以使用
.row_names_info()
,默认为type = 1L
,负号表示行名是自动生成的。您还可以通过更改
type
参数来查看其他信息。typeinteger。当前,type = 0返回内部“row.names”属性(可能为NULL),type = 2返回该属性隐含的行数,type = 1返回“自动”行名称的负号。
对于列名,这就不那么容易了。一般来说,如果您看到列名的所有
NA
值,或者names(x)
返回NULL
,则x
的“names”属性没有设置,因此x
没有(列名)。否则,前缀
X
通常意味着名称来自make.names()
,data.frame()
和read.table()
,read.csv()
等使用。而您通常会从
as.data.frame()
中获得前置的V
然而,这不是一个规则。这取决于你传递给
as.data.frame()
的对象的类,以及你是否改变了任何默认参数。最好的办法是筛选许多methods(as.data.frame)
,看看你是否能发现一个模式。x759pob22#