Read.csv vs. read.table
В нескольких случаях я видел, что в то время как read.table()
не может читать файл с разделителями табуляции (например, таблицу аннотаций микрочипа), возвращается следующая ошибка:
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
line xxx did not have yyy elements
read.csv()
отлично работает в одном файле без ошибок. Я думаю, что скорость read.csv()
также выше, чем read.table()
.
Еще больше: read.table()
делает очень сумасшедший, читая файл со мной. Он делает эту ошибку при чтении строки 100, но когда я копирую и вставляю строки от 90 до 110 сразу после главы того же файла, она по-прежнему делает ошибку строки 100 + 21 (новые строки копируются в начале). Если в этой строке есть какие-либо проблемы, почему она не сообщает об этой ошибке при чтении вставленной строки в начале? Я подтверждаю, что read.csv()
читает тот же файл без ошибок.
У вас есть представление о том, почему read.table()
не может прочитать те же файлы, что и read.csv()
работает на нем? Также есть ли какая-либо причина использовать read.table()
в любом случае?
Ответы
Ответ 1
read.csv
- довольно тонкая обертка вокруг read.table
; Я был бы очень удивлен, если бы вы не смогли точно воспроизвести поведение read.csv
, предоставив правильные аргументы read.table
. Однако некоторые из этих аргументов (например, способ обращения к кавычками или комментариям) могут изменить скорость и поведение функции.
В частности, это полное определение read.csv
:
function (file, header = TRUE, sep = ",", quote = "\"", dec = ".",
fill = TRUE, comment.char = "", ...) {
read.table(file = file, header = header, sep = sep, quote = quote,
dec = dec, fill = fill, comment.char = comment.char, ...)
}
так как он указал только read.table
с определенным набором опций.
Как указано в @Chase в комментариях ниже, страница справки для read.table()
говорит так же, как в Details
:
read.csv и read.csv2 идентичны read.table, за исключением значений по умолчанию. Они предназначены для чтения "файлов с разделителями-запятыми (".csv ") или (read.csv2) вариант, используемый в странах, которые используют запятую в качестве десятичной точки и точку с запятой в качестве разделителя полей.
Ответ 2
Не используйте read.table
для чтения файлов с разделителями табуляции, используйте read.delim
. (Это всего лишь тонкая оболочка вокруг read.table
, но она устанавливает параметры для соответствующих значений)
Ответ 3
read_table()
выполняется некорректно на вкладке sep
'ed файл и установка sep='\s+'
может помочь предположить, что элемент в вашей таблице не имеет места