Почему write.csv и read.csv несовместимы?

Проблема проста, рассмотрим следующий пример:

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 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

Ответ 1

Вот моя догадка...

write.table записывает data.frame в файл, а data.frames всегда имеют имена строк, поэтому по умолчанию имена строк не будут выбрасывать информацию. (Да, write.table также будет писать матрицу, а матрицы не должны иметь имена строк, но data.frames, вероятно, используются гораздо чаще, чем матрицы.)

read.table возвращает файл data.frame, но CSV файлы не имеют понятия имен строк, поэтому кто-то может утверждать, что он интуитивно понятен предположить, по умолчанию, что первый столбец CSV - это имя строки.

Теперь может быть способ сделать эти две функции согласованными, но я бы сказал, что запись в текстовый файл не лучший способ вывода/ввода данных из одной сессии R в другую. Гораздо безопаснее/быстрее использовать save, load, saveRDS, readRDS и т.д.