Ошибка при импорте набора данных: "Ошибка сканирования (...): в строке 1 не было 145 элементов"

Я пытаюсь импортировать мой набор данных в R, используя read.table():

Dataset.df <- read.table("C:\\dataset.txt", header=TRUE)

Но я получаю следующее сообщение об ошибке:

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  :
   line 1 did not have 145 elements

Что это значит и как я могу это исправить?

Ответ 1

Эта ошибка довольно понятна. Кажется, что в первой строке вашего файла данных (или во второй строке) отсутствуют данные, так как вы используете header = TRUE).

Вот мини-пример:

## Create a small dataset to play with
cat("V1 V2\nFirst 1 2\nSecond 2\nThird 3 8\n", file="test.txt")

R автоматически обнаруживает, что он должен ожидать имена розеток плюс два столбца (3 элемента), но он не находит 3 элемента в строке 2, поэтому вы получаете сообщение об ошибке:

read.table("test.txt", header = TRUE)
# Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
#   line 2 did not have 3 elements

Посмотрите на файл данных и посмотрите, действительно ли проблема:

cat(readLines("test.txt"), sep = "\n")
# V1 V2
# First 1 2
# Second 2
# Third 3 8

Возможно, потребуется ручная коррекция, или мы можем предположить, что значение первого значения в строке строки "Второе" должно быть в первом столбце, а другие значения должны быть NA. Если это так, fill = TRUE достаточно, чтобы решить вашу проблему.

read.table("test.txt", header = TRUE, fill = TRUE)
#        V1 V2
# First   1  2
# Second  2 NA
# Third   3  8

R также достаточно умен, чтобы понять, сколько элементов ему нужно, даже если отсутствуют имена ростов:

cat("V1 V2\n1\n2 5\n3 8\n", file="test2.txt")
cat(readLines("test2.txt"), sep = "\n")
# V1 V2
# 1
# 2 5
# 3 8
read.table("test2.txt", header = TRUE)
# Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
#   line 1 did not have 2 elements
read.table("test2.txt", header = TRUE, fill = TRUE)
#   V1 V2
# 1  1 NA
# 2  2  5
# 3  3  8

Ответ 2

При запуске этой ошибки и анализе моего набора данных, который, как представляется, не имел отсутствующих данных, я обнаружил, что некоторые из моих записей имеют специальный символ "#", который сбрасывает импорт данных. Как только я удалил "#" из оскорбительных ячеек, данные импортировались без проблем.

Ответ 3

Я столкнулся с этой проблемой при импорте некоторых файлов из данных Add Health в R (см. http://www.icpsr.umich.edu/icpsrweb/ICPSR/studies/21600?archive=ICPSR&q=21600). Например, следующая команда для чтения файла данных DS12 в формате, разделенном вкладками .tsv, создаст следующую ошибку:

ds12 <- read.table("21600-0012-Data.tsv", sep="\t", comment.char="", 
quote = "\"", header=TRUE)

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, 
na.strings,  : line 2390 did not have 1851 elements

Похоже, что есть небольшая проблема с форматированием некоторых файлов, которые заставляют R отклонять файл. По крайней мере, часть проблемы представляет собой случайное использование двойных кавычек вместо апострофа, который вызывает нечетное число символов двойной кавычки в строке.

После игры я определил три возможных решения:

  • Откройте файл в текстовом редакторе и найдите/замените все экземпляры символа кавычки "ничем". Другими словами, удалите все двойные кавычки. Для этих данных с разделителями табуляции это означало лишь то, что некоторые стенографические отрывки комментариев от предметов больше не содержались в кавычках, которые не были проблемой для моего анализа данных.

  • С данными, хранящимися в ICPSR (см. ссылку выше) или другими архивами, другим решением является загрузка данных в новом формате. Хорошим вариантом в этом случае является загрузка версии Stata DS12, а затем ее открытие с помощью команды read.dta следующим образом:

    library(foreign)
    ds12 <- read.dta("21600-0012-Data.dta")
    
  • Связанное решение/взлом - это открыть файл .tsv в Excel и повторно сохранить его в виде текстового файла, разделенного вкладкой. Кажется, что он очищает любую проблему форматирования, делая R недовольным.

Ни один из них не идеален в том смысле, что они не совсем решают проблему в R с исходным .tsv файлом, но для перебора данных часто требуется использование нескольких программ и форматов.

Ответ 4

Если вы используете linux, а файл данных - из окон. Вероятно, это потому, что символ ^ M Найдите его и удалите. сделано!

Ответ 5

Для других, которые не могут найти решение и знают, что в данных отсутствуют элементы:

У меня есть эта проблема, когда я использую Excel 2013 для сохранения файлов как .csv, а затем попытаюсь загрузить их в R, используя read.table(). Обходной путь, который я нашел, - вставить данные прямо из Excel в документ .txt, затем открыть с помощью:

read.table(file.choose(), sep="\t").

Надеюсь, это поможет.

Ответ 6

Я столкнулся с этой ошибкой, когда у меня был row.names = "id" (на tutorial) с столбцом с именем "идентификатор".

Ответ 7

Помимо всех упомянутых выше рекомендаций, вы также можете проверить все данные.

Если между словами есть пробелы, вы должны заменить их на "_".

Однако так я решаю свою проблему.

Ответ 8

Hash # символ создания этой ошибки, если вы можете удалить # из начала имени столбца, это может решить проблему.

По сути, когда имя столбца начинается с # между строками, read.table() распознает в качестве отправной точки для этой строки.

Ответ 9

Этот простой метод решил проблему для меня: Скопируйте содержимое набора данных, откройте пустой лист Excel, выберите "Специальная вставка" → "Значения" и сохраните. Вместо этого импортируйте новый файл.

(Я перепробовал все существующие решения, но ни одно из них не помогло. В моем старом наборе данных не было пропущенных значений, пробелов, специальных символов или встроенных формул.)

Ответ 10

Одна из моих переменных была категоричной, поскольку одна альтернатива была многострочной ( "no event" ). Когда я использовал read.table, он предположил, что пространство после первой строки означало конец точки данных, а вторая строка была перенесена на следующую переменную. Для решения проблемы я использовал sep = "\ t". Я использовал RStudio в среде Mac OX. Предыдущим решением было преобразовать файлы .txt в .csv в Excel, а затем открыть их с помощью функции read.csv.