测试data.frame中现有行名称和列名称

63lcw9qa  于 2023-03-27  发布在  其他
关注(0)|答案(2)|浏览(134)

是否有一个函数可以确定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,没有实际名称的线索。

jexiocij

jexiocij1#

**简短版本:**只有当属性“names”为NULL时, Dataframe 才会没有列名。因此,检查 Dataframe 中是否存在列名的简单方法如下所示。

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参数来查看其他信息。

typeinteger。当前,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的“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

而您通常会从as.data.frame()中获得前置的V

as.data.frame(m)
#   V1 V2 V3
# 1  1  3  5
# 2  2  4  6

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

x759pob2

x759pob22#

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

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

相关问题