1. ホーム
  2. r

[解決済み] R: 空のデータフレームに行を追加すると、列名が失われる

2023-08-11 19:42:11

質問

空のデータフレームに最初の行を挿入すると、元の列名が失われてしまいます。

の例です。

a<-data.frame(one = numeric(0), two = numeric(0))
a
#[1] one two
#<0 rows> (or 0-length row.names)
names(a)
#[1] "one" "two"
a<-rbind(a, c(5,6))
a
#  X5 X6
#1  5  6
names(a)
#[1] "X5" "X6"

ご覧のように、カラム名 1 に置き換えられました。 X5 そして X6 .

なぜこのようなことが起こるのか、また、列名を失うことなくこれを行う正しい方法はあるのか、どなたか教えていただけないでしょうか。

ショットガンによる解決策は、補助的なベクトルに名前を保存し、データフレームでの作業が終了したときにそれらを追加することでしょう。

ありがとうございます。

コンテキスト

いくつかのデータを収集し、パラメータとして受け取ったデータフレームに新しい行として追加する関数を作成しました。 データフレームを作成し、データソースを繰り返し、その結果で満たされるように、各関数呼び出しに data.frame を渡します。

どのように解決するのですか?

この rbind のヘルプページでは、次のように指定されています。

cbind' ('rbind')では、長さ0のベクトル('NULL'を含む)は、無視されます。 (NULL'を含む)は無視されます。 Sとの互換性のため、結果が0行(0列)にならない限り (列)を持たない限り無視されます。 (ゼロ拡張の行列は S3では発生せず、Rでも無視されます)。

では、実際に a は無視され、あなたの rbind 命令では無視されます。完全に無視されるわけではありませんが、データフレームであるため rbind として呼び出されるからです。 rbind.data.frame :

rbind.data.frame(c(5,6))
#  X5 X6
#1  5  6

行を挿入する1つの方法として、もしかしたら:

a[nrow(a)+1,] <- c(5,6)
a
#  one two
#1   5   6

しかし、あなたのコードによってはもっと良い方法があるかもしれません。