测试 data.frame 中现有的 row.names 和 col.names
test for existing row.names and col.names in data.frame
是否有函数可以确定 data.frame 是否具有本机行名和列名或仅具有自动生成的行名和列名 (1 2 3 4...)?对于列名,'automatically' 表示例如当您将 "as.data.frame" 应用于矩阵时..
对于行名,我想出了一个解决方法:
has.row.names = function(df) {
!all(row.names(df)==seq(1, nrow(df)))
}
但是,对于列名,我不知道该怎么做。困难在于有时自动 col.names 以 V1 V2 等开始,有时以 X1., X2..
编辑:为什么我问这个问题:我需要在一个更复杂的函数(有点类似于 PCA 的图形输出)中执行这个测试,该函数将绘制行名称和列名称(如果存在),如果不存在,它将创建更合适的新名称。
所以它应该适用于 "any" data.frame,不知道实际名称..
谢谢。
#Use exists
with(mtcars,exists("cyl"))
[1] TRUE
with(mtcars,exists("cy"))
[1] FALSE
简短版本: 数据框唯一没有列名的情况是属性 "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)
returns 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()
的对象的 class,以及您是否更改了任何默认参数。最好的办法是筛选许多 methods(as.data.frame)
以查看是否可以发现一个模式。
是否有函数可以确定 data.frame 是否具有本机行名和列名或仅具有自动生成的行名和列名 (1 2 3 4...)?对于列名,'automatically' 表示例如当您将 "as.data.frame" 应用于矩阵时..
对于行名,我想出了一个解决方法:
has.row.names = function(df) {
!all(row.names(df)==seq(1, nrow(df)))
}
但是,对于列名,我不知道该怎么做。困难在于有时自动 col.names 以 V1 V2 等开始,有时以 X1., X2..
编辑:为什么我问这个问题:我需要在一个更复杂的函数(有点类似于 PCA 的图形输出)中执行这个测试,该函数将绘制行名称和列名称(如果存在),如果不存在,它将创建更合适的新名称。 所以它应该适用于 "any" data.frame,不知道实际名称..
谢谢。
#Use exists
with(mtcars,exists("cyl"))
[1] TRUE
with(mtcars,exists("cy"))
[1] FALSE
简短版本: 数据框唯一没有列名的情况是属性 "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)
returns 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()
的对象的 class,以及您是否更改了任何默认参数。最好的办法是筛选许多 methods(as.data.frame)
以查看是否可以发现一个模式。