3

data.frame にネイティブの行名と列名があるか、自動的に生成されたもの (1 2 3 4...) があるかを判断する関数はありますか? 列名の場合、「自動的に」は、たとえば「as.data.frame」をマトリックスに適用する場合を意味します..

行名については、回避策を見つけました:

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

ただし、列名については、その方法がわかりません。問題は、自動化された col.name が V1 V2 などで始まる場合があり、X1.、X2. で始まる場合があることです。

編集:なぜこの質問をするのか: このテストは、存在する場合は行名と列名をプロットするより複雑な関数 (PCA のグラフィカル出力に多少似ています) 内で実行する必要があり、存在しない場合はより適したものを作成します新しい名前。したがって、実際の名前の手がかりがなくても、「任意の」data.frameで機能するはずです..

ありがとう。

4

2 に答える 2

8

短いバージョン:データ フレームに列名がないのは、属性「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、の「names」属性がx設定されxていないため、(列) 名がありません。

それ以外の場合、先頭に追加された aXは通常、名前が から来たことを意味し、これはおよびなどで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

一方、通常は先頭に追加さVれますas.data.frame()

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

ただし、これはルールではありません。に渡すオブジェクトのクラスとas.data.frame()、デフォルトの引数を変更したかどうかによって異なります。最善の方法は、多くのパターンをふるいにかけmethods(as.data.frame)、パターンを発見できるかどうかを確認することです。

于 2015-02-28T02:22:26.697 に答える
1
#Use exists
with(mtcars,exists("cyl"))
[1] TRUE

with(mtcars,exists("cy"))
[1] FALSE
于 2015-02-28T02:02:33.943 に答える