11

問題は単純です。次の例を考えてみましょう。

m <- head(iris)
write.csv(m, file = 'm.csv')
m1 <- read.csv('m.csv')

この結果、「X」という名前の新しい最初の列があるというm1点で、元のオブジェクトとは異なります。m本当にそれらを等しくしたい場合は、次の 2 つの例のように、追加の引数を使用する必要があります。

write.csv(m, file = 'm.csv', row.names = FALSE)
# and then
m1 <- read.csv('m.csv')

また

write.csv(m, file = 'm.csv')
m1 <- read.csv('m.csv', row.names = 1)

問題は、この違いの理由は何ですか?特に、なぜwrite.csvread.csvが Excel の慣習に固執することを意図しているのに、そもそもエクスポートされたものと同じオブジェクトをインポートしないのでしょうか? 私にとって、これは非常に直感に反する動作であり、非常に望ましくありません。

(これらの関数の csv2 バリアントを使用すると、この結果はまったく同じになります)

前もって感謝します!


これらは data.framesmでありm1、例を見るために R を使用したくない場合:

> m
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

> m1
  X Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 1          5.1         3.5          1.4         0.2  setosa
2 2          4.9         3.0          1.4         0.2  setosa
3 3          4.7         3.2          1.3         0.2  setosa
4 4          4.6         3.1          1.5         0.2  setosa
5 5          5.0         3.6          1.4         0.2  setosa
6 6          5.4         3.9          1.7         0.4  setosa
4

1 に答える 1

2

これが私の推測です...

write.tabledata.frame をファイルに書き込み、data.frames には常に行名があるため、デフォルトで行名を書き込まないと情報が破棄されます。(はい、write.table行列も書き込みます。行列には行名を付ける必要はありませんが、data.frames はおそらく行列よりもはるかに頻繁に使用されます。)

read.tableは data.frame を返しますが、CSV ファイルには行名の概念がないため、デフォルトで CSV の最初の列が行名であると仮定するのは直観に反すると主張する人がいるかもしれません。

これら 2 つの機能を一致させる方法があるかもしれませんが、テキスト ファイルへの書き込みは、ある R セッションから別の R セッションにデータを出力/入力するための最良の方法ではないと主張します。saveloadsaveRDSreadRDSなどを使用する方がはるかに安全/高速です。

于 2012-09-20T12:51:58.250 に答える