【问题标题】:Why write.csv and read.csv are not consistent? [closed]为什么 write.csv 和 read.csv 不一致? [关闭]
【发布时间】:2012-09-12 18:52:04
【问题描述】:

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

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

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

提前致谢!


如果您不想使用 R 来查看示例,这些是 data.frames mm1

> 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

【问题讨论】:

  • 为什么它们不一致很重要?现在无法更改默认值。出于好奇,它在哪里说 read.csvwrite.csv 应该使用一些 Excel 约定?
  • 正如我之前所说,我认为这与直觉相反,但这只是我的看法。特别是,如果write.csvread.csv 是一种“快速”忘记细节和“只做你需要的事情”的方式,这很烦人。就我而言,我总是忘记这个细节。您可以通过?write.table阅读有关此 Excel 约定的信息。
  • @Juan 所以写你自己的包装器来设置你喜欢的默认值。这毕竟是一种编程语言。
  • 来自svn log src/library/utils/R/write.table.R "r32344 | ripley | 2004-12-27 08:25:32 -0500(2004 年 12 月 27 日星期一)| 4 行;添加 write.csv[2]"(和在 r34879 中,“允许 write.csv(row.names=FALSE)”)
  • @flodel:如果有办法在线执行此操作会很好,但我不知道有一个。胡安,如果你愿意,你可以在stackoverflow.com/questions/1535021/… 上发布这个问题作为答案...

标签: r import export export-to-csv read.table


【解决方案1】:

这是我的猜测......

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

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

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

【讨论】:

  • 这可能是我们将得到的最佳答案,除非 Brian Ripley 自己来到这里并给我们一些启示!谢谢约书亚。
  • 由于saveload和相关函数是保留所有信息的最佳选择,我认为write.csvread.csv应该优先考虑易用性(我认为默认情况下不保存行名可以实现这一点),但在导出时保留使用row.names = TRUE的选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多