【发布时间】: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.csv 和 read.csv 应该遵守 Excel 约定,为什么不导入最初导出的相同对象?对我来说,这是一种非常反直觉的行为,非常不受欢迎。
(如果我使用这些函数的 csv2 变体,结果完全相同)
提前致谢!
如果您不想使用 R 来查看示例,这些是 data.frames m 和 m1:
> 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.csv和write.csv应该使用一些 Excel 约定? -
正如我之前所说,我认为这与直觉相反,但这只是我的看法。特别是,如果
write.csv和read.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