测试data.frame中现有的row.names和col.names

age*_*nis 2 attributes r dataframe rowname

是否有一个函数来确定data.frame是否具有本机行名和列名,或者只是自动生成的(1 2 3 4 ...)?对于列名称," 自动 "表示例如将"as.data.frame"应用于矩阵时.

对于行名称,我找到了一个解决方法:

has.row.names = function(df) {
  !all(row.names(df)==seq(1, nrow(df)))
}
Run Code Online (Sandbox Code Playgroud)

但是,对于列名称,我看不到如何做到这一点.困难在于有时自动化的col.names以V1 V2等开始,有时使用X1.,X2 ..

编辑:为什么我问这个问题:我需要在一个更复杂的函数(有点类似于PCA的图形输出)中执行此测试,该函数将绘制行名称和列名称(如果存在),如果不是,它将创建更适合新名字.所以它应该适用于"任何"data.frame,没有实际名称的线索..

谢谢.

Ric*_*ven 7

短版本:数据框不具有列名的唯一时间是属性"names"为NULL.因此,检查数据框中列名称是否存在的简单方法如下所示.

DFHasColNames <- function(x) {
    stopifnot(is.data.frame(x))
    Negate(is.null)(names(x))
}
DFHasColNames(mtcars)
# [1] TRUE
DFHasColNames(unname(mtcars))
# [1] FALSE
Run Code Online (Sandbox Code Playgroud)

扩展版本:对于行名称,您可以使用.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
Run Code Online (Sandbox Code Playgroud)

您还可以通过更改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
Run Code Online (Sandbox Code Playgroud)

对于列名称,它并不那么容易.一般来说,如果您看到NA列名称或names(x)返回的所有值NULL,x则不会设置"names"属性,因此x没有(列)名称.

否则,前置X通常意味着名称来自make.names(),data.frame()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
Run Code Online (Sandbox Code Playgroud)

而你通常得到一个前缀Vas.data.frame()

as.data.frame(m)
#   V1 V2 V3
# 1  1  3  5
# 2  2  4  6
Run Code Online (Sandbox Code Playgroud)

但是,这不是一个规则.它取决于您传递给的对象的类as.data.frame(),以及您是否更改了任何默认参数.最好的办法是筛选许多人methods(as.data.frame),看看你是否能发现一种模式.