gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:37:36 24 4
gpt4 key购买 nike

是否有一个函数可以确定 data.frame 是否具有 native 行名和列名或仅具有自动生成的 (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,没有实际名称的线索..

谢谢。

最佳答案

简短版: 数据框唯一没有列名的情况是属性“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 integer. Currently type = 0 returns the internal "row.names" attribute (possibly NULL), type = 2 the number of rows implied by the attribute, and type = 1 the latter with a negative sign for ‘automatic’ row names.

.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()使用以及 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) 看看你是否能发现一个模式。

关于r - 测试 data.frame 中现有的 row.names 和 col.names,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28777073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com