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)
这是我的猜测...
write.table
将 data.frame 写入文件,并且 data.frames 始终具有行名称,因此默认情况下不写入行名称将丢弃信息。(是的,write.table
还会写一个矩阵,矩阵不必有行名称,但 data.frames 可能比矩阵更常用。)
read.table
返回 data.frame 但 CSV 文件没有任何行名称的概念,因此有人可能会认为默认情况下假设 CSV 的第一列是行名称是违反直觉的。
现在可能有一种方法可以使这两个函数保持一致,但我认为写入文本文件并不是将数据从一个 R 会话输出/输入到另一个 R 会话的最佳方法。使用save
、load
、saveRDS
、readRDS
等更安全/更快。