简短版本:数据框唯一没有列名的情况是属性“名称”为 NULL 时。因此,检查数据框中是否存在列名的简单方法如下所示。
DFHasColNames <- function(x) {
stopifnot(is.data.frame(x))
Negate(is.null)(names(x))
}
DFHasColNames(mtcars)
# [1] TRUE
DFHasColNames(unname(mtcars))
# [1] FALSE
扩展版:对于行名,您可以使用.row_names_info()
. 默认情况下type = 1L
,负号表示行名是自动生成的。
.row_names_info(mtcars)
# [1] 32 # row names were provided
.row_names_info(iris)
# [1] -150 # row names were generated automatically
您还可以通过更改type
参数来查看其他信息。
输入整数。当前 type = 0 返回内部的“row.names”属性(可能为 NULL),type = 2 该属性隐含的行数,type = 1 后者带有负号表示“自动”行名。
.row_names_info(mtcars, type = 0)
## ... returns attr(mtcars, "row.names")
.row_names_info(iris, type = 0)
## [1] NA -150
对于列名,这并不容易。一般来说,如果您看到NA
列名称的所有值,或者names(x)
返回NULL
,则“名称”属性x
未设置,因此x
没有(列)名称。
否则,前缀X
通常表示名称来自,make.names()
由data.frame()
and和其他人使用。read.table()
read.csv()
m <- matrix(1:6, 2)
make.names(seq_len(ncol(m)))
# [1] "X1" "X2" "X3"
data.frame(m)
# X1 X2 X3
# 1 1 3 5
# 2 2 4 6
而您通常会V
从as.data.frame()
as.data.frame(m)
# V1 V2 V3
# 1 1 3 5
# 2 2 4 6
然而,这不是一个规则。这取决于您传递给的对象的类as.data.frame()
,以及您是否更改了任何默认参数。最好的办法是筛选许多methods(as.data.frame)
,看看你是否能发现一种模式。