この由緒あるRの煩わしさを調査すると、このページにたどり着きました。私はGeorgの優れた答え( https://stackoverflow.com/a/41609844/2757825 )にもう少し説明を追加したいと思いました。これはOPによって引き起こされた問題(フィールド名の喪失)を解決するだけでなく、要因へのすべてのフィールド。私にとって、これら2つの問題は一緒に起こります。ベースRで、余分なコードを記述せずに、データフレームの定義、行の追加という2つの異なる操作を保持するソリューションが必要でした。これは、Georgの回答が提供するものです。
以下の最初の2つの例は問題を示し、3番目と4番目はGeorgの解決策を示しています。
例1:rbindを使用して新しい行をベクトルとして追加します
- 結果:列名が失われ、すべての変数が因子に変換されます
my.df <- data.frame(
table = character(0),
score = numeric(0),
stringsAsFactors=FALSE
)
my.df <- rbind(
my.df,
c("Bob", 250)
)
my.df
X.Bob. X.250.
1 Bob 250
str(my.df)
'data.frame': 1 obs. of 2 variables:
$ X.Bob.: Factor w/ 1 level "Bob": 1
$ X.250.: Factor w/ 1 level "250": 1
例2:rbind内のデータフレームとして新しい行を追加します
- 結果:列名は保持されますが、文字変数は因子に変換されます。
my.df <- data.frame(
table = character(0),
score = numeric(0),
stringsAsFactors=FALSE
)
my.df <- rbind(
my.df,
data.frame(name="Bob", score=250)
)
my.df
name score
1 Bob 250
str(my.df)
'data.frame': 1 obs. of 2 variables:
$ name : Factor w/ 1 level "Bob": 1
$ score: num 250
例3:stringsAsFactors = FALSEを使用して、rbind内の新しい行をデータフレームとして追加します
my.df <- data.frame(
table = character(0),
score = numeric(0),
stringsAsFactors=FALSE
)
my.df <- rbind(
my.df,
data.frame(name="Bob", score=250, stringsAsFactors=FALSE)
)
my.df
name score
1 Bob 250
str(my.df)
'data.frame': 1 obs. of 2 variables:
$ name : chr "Bob"
$ score: num 250
例4:例3と同様ですが、一度に複数の行を追加します。
my.df <- data.frame(
table = character(0),
score = numeric(0),
stringsAsFactors=FALSE
)
my.df <- rbind(
my.df,
data.frame(
name=c("Bob", "Carol", "Ted"),
score=c(250, 124, 95),
stringsAsFactors=FALSE)
)
str(my.df)
'data.frame': 3 obs. of 2 variables:
$ name : chr "Bob" "Carol" "Ted"
$ score: num 250 124 95
my.df
name score
1 Bob 250
2 Carol 124
3 Ted 95