Почему 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
и т.д.