为什么write.csv和read.csv不一致?

Jua*_*uan 11 import export r export-to-csv read.table

问题很简单,请考虑以下示例:

m <- head(iris)
write.csv(m, file = 'm.csv')
m1 <- read.csv('m.csv')
Run Code Online (Sandbox Code Playgroud)

其结果是m1与原始对象的不同之处m在于它具有名为"X"的新的第一列.如果我真的想让它们相等,我必须使用其他参数,就像在这两个例子中一样:

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

要么

write.csv(m, file = 'm.csv')
m1 <- read.csv('m.csv', row.names = 1)
Run Code Online (Sandbox Code Playgroud)

问题是,这种差异的原因是什么?特别是,为什么如果write.csv并且read.csv本来打算坚持Excel约定,那么不要导入首先导出的同一个对象?对我来说,这是一种非常反直觉的行为,非常不受欢迎.

(如果我使用这些函数的csv2变体,这个结果会完全相同)

提前致谢!


这些是data.frames m,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
Run Code Online (Sandbox Code Playgroud)

Jos*_*ich 2

这是我的猜测...

write.table将 data.frame 写入文件,并且 data.frames 始终具有行名称,因此默认情况下不写入行名称将丢弃信息。(是的,write.table还会写一个矩阵,矩阵不必有行名称,但 data.frames 可能比矩阵更常用。)

read.table返回 data.frame 但 CSV 文件没有任何行名称的概念,因此有人可能会认为默认情况下假设 CSV 的第一列是行名称是违反直觉的。

现在可能有一种方法可以使这两个函数保持一致,但我认为写入文本文件并不是将数据从一个 R 会话输出/输入到另一个 R 会话的最佳方法。使用saveloadsaveRDSreadRDS等更安全/更快。