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

时间:2015-02-28 01:34:43

标签: r dataframe attributes rowname

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

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

has.row.names = function(df) {
  !all(row.names(df)==seq(1, nrow(df)))
}

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

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

感谢。

2 个答案:

答案 0 :(得分:6)

短版本:数据框没有列名的唯一情况是属性“names”为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的“名称”属性未设置,因此{{1没有(列)名称。

否则,前缀x通常表示名称来自Xmake.names()data.frame()read.table()和其他人使用。{/ p>

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()以查看是否可以发现模式。

答案 1 :(得分:1)

#Use exists
with(mtcars,exists("cyl"))
[1] TRUE

with(mtcars,exists("cy"))
[1] FALSE