11

问题很简单,考虑下面的例子:

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

这样做的结果是它m1与原始对象的不同之处m在于它有一个名为“X”的新的第一列。如果我真的想让它们相等,我必须使用额外的参数,比如这两个例子:

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.csv并且read.csv应该遵守 Excel 约定,为什么不导入最初导出的相同对象?对我来说,这是一种非常反直觉的行为,非常不受欢迎。

(如果我使用这些函数的 csv2 变体,结果完全一样)

提前致谢!


这些是 data.frames mm1如果您不想使用 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.table将 data.frame 写入文件并且 data.frames 始终具有行名,因此默认情况下不写入行名会丢弃信息。(是的,write.table也会写一个矩阵,矩阵不必有行名,但 data.frames 可能比矩阵更常用。)

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

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

于 2012-09-20T12:51:58.250 回答