read.delim() - ошибки больше столбцов, чем имена столбцов и заголовок, а «имена столбцов имеют разную длину»

Предварительная информация ОС: Windows XP Professional Version 2002 Service Pack 3; Версия R: R 2.12.2 (2011-02-25)

Я пытаюсь прочитать 30 000 строк на 80 столбцов, текстовый файл с разделителями табуляции в R, используя функцию read.delim(). В этом файле есть заголовки столбцов со следующим соглашением об именах: "_". Код, который я использую, чтобы попытаться прочитать данные:

cc <- c("integer", "character", "integer", rep("character", 3), 
        rep("integer", 73))

example_data <- read.delim(file = 'C:/example.txt', row.names = FALSE,
                           col.names = TRUE, as.is = TRUE, colClasses = cc)

После отправки этой команды я получаю следующее сообщение об ошибке:

Error in read.table(file = file, header = header, sep = sep, quote = quote,  : 
more columns than column names
In addition: Warning message:
In read.table(file = file, header = header, sep = sep, quote = quote,  :
  header and 'col.names' are of different lengths

Информация, которая может быть важной - от столбца 8 до столбца 80 количество нулей в каждом столбце следующее:

column 08: 29,000 zeros
column 13: 15,000 zeros
column 19: 500 zeros
column 43: 15,000 zeros
columns 65-80: 29,000 zeros for each column

Может ли кто-нибудь помочь определить причины, по которым я получаю вышеуказанные сообщения об ошибках? Любая помощь будет оценена.


person Jubbles    schedule 02.09.2011    source источник
comment
Что это возвращает: count.fields(file = 'C:/example.txt', sep="\t")[1:10] ?   -  person IRTFM    schedule 02.09.2011
comment
@James: Вы правы - копия имеет длину 79, что является фактическим количеством столбцов в моем файле. В своем посте я округлил размеры.   -  person Jubbles    schedule 02.09.2011
comment
@DWin: я использую R уже несколько лет и каждый день узнаю что-то новое. Спасибо, что познакомили меня с функцией count.fields().   -  person Jubbles    schedule 02.09.2011
comment
@Jubbles: пожалуйста. Я считаю count.fields важной частью набора инструментов для ввода данных. Это также полезно для определения того, в каких строках есть такие странные биты, как несопоставленные кавычки или неожиданные символы комментариев.   -  person IRTFM    schedule 02.09.2011


Ответы (3)


Причиной проблемы является использование вами аргумента col.names=TRUE. Предполагается, что это нужно использовать вручную для указания имен столбцов для результирующего фрейма данных, и поэтому он должен быть вектором той же длины, что и столбцы во входных данных, по одному имени на столбец.

если вы хотите, чтобы read.delim брала имена столбцов из файла, рассмотрите возможность использования header=TRUE; вы также можете пересмотреть row.names=TRUE, так как это снова предназначено как спецификация имен строк, а не как инструкция по их чтению из файла.

Более подробная информация доступна на странице справки для read.delim.

person MatthewS    schedule 02.09.2011
comment
Ты прав. Теперь я немного смущен своим вопросом. Я так привык записывать данные с помощью write.table(..., row.names = FALSE, col.names = TRUE, ...), что забыл, что при чтении данных col.names задает вектор типов символов. - person Jubbles; 02.09.2011
comment
Не нужно смущаться, что несоответствие между read.table и write.table скорее ловушка! - person MatthewS; 02.09.2011

У меня также недавно была такая же ошибка, и она исчезла после преобразования файла в разделители с запятой или точкой с запятой и чтения с помощью read.csv/read.csv2. Я знаю, что это не полный ответ, но, может быть, вы могли бы проверить это.

person langohrschnauze    schedule 02.09.2011

Если вы хотите читать как символьную матрицу, сначала преобразуйте файл в формат .csv и используйте read.csv. Не используйте никакое другое объявление, кроме имени файла. например.;

read.csv("filepath")
person Mithilesh Kumar    schedule 29.11.2015