2015-02-21 5 views
2

я получаю сообщение об ошибке с read.table():read.table() ошибка, даже если все элементы присутствуют

data <- read.table(file, header=T, stringsAsFactors=F, sep="@") 
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : 
    line 160 did not have 28 elements 

Я проверил линию 160, и он имел 28 элементов (это было 27 @ символов).

Я проверил все линии 30242, где было 816534 @ символов, что составляет 27 строк, поэтому я уверен, что каждая строка содержит 28 элементов. Я также проверил файл, чтобы убедиться, что в нем нет никаких символов, кроме как разделителей.

Есть ли у кого-нибудь идеи, что здесь происходит?

редактировать: Строка 160 файла

158 @ психического состояния: 1. Общие клинические симптомы @ MD @ S @ 2002 @ CMP-005 @ 02 @ 20.67 @ 23.58 @ клозапин против типичных нейролептиков для шизофрения @ IV @ 4.47 @ 02 @ АНАЛИЗ ЧУВСТВИТЕЛЬНОСТИ - КИТАЙСКИЕ ИСПЫТАНИЯ @ CD000059 @ 6.94 @ Фиксированные @ 16 @ 5 @ 2 @ 45 @ Китайские испытания @ YES @ Xia 2002 (CPZ) @ STD-Xia-2002-_x0028_CPZ_x0029_ @ 579 @ 566 @ 40

edit2: Строка 161 файла

159 @ Длина операции (мин) @ MD @ Y @ 1995 @ CMP-001 @ 01 @ 59.0 @ 47.0 @ Gamma и других cephalocondylic интрамедуллярных ногтей против экстрамедуллярных имплантат для внекапсуларного переломы бедра у взрослых @ IV @ 23.9 @ 01 @ Резюме: Бедровый гвоздь (все типы) против скользкого винта (SHS) @ CD000093 @ 13.3 @ Random @ 12 @ 1 @ 1 @ 53 @ Gamma nail @ YES @ O'Brien 1995 @ STD-O_x0027_Brien-1995 @ 958 @ 941 @ 49

+0

Просматривайте разделы своих данных вокруг проблемной строки, используя аргументы 'skip' и' nrows', чтобы определить, можете ли вы изолировать проблему. – user20650

+2

По какой-то причине, когда я использовал read.csv с аргументом sep = "@", он работал нормально. – user3821273

+0

Хм ... может, вам нужно было установить 'fill = TRUE' в' read.table'. (хотя это может спровоцировать проблему, которую учитывает 'fill', на что следует обратить внимание) – user20650

ответ

5

Я думаю, проблема в том, что есть символ новой строки, который должен быть признан аргументом quote. Давайте посмотрим.

txt <- c(
    "[email protected] state: 1. Overall clinical [email protected]@[email protected]@[email protected]@[email protected]@Clozapine versus typical neuroleptic medication for [email protected]@[email protected]@SENSITIVITY ANALYSIS - CHINESE [email protected]@[email protected]@[email protected]@[email protected]@Chinese [email protected]@Xia 2002 (CPZ)@[email protected]@[email protected]", 
    "[email protected] of surgery (minutes)@[email protected]@[email protected]@[email protected]@[email protected] and other cephalocondylic intramedullary nails versus extramedullary implants for extracapsular hip fractures in [email protected]@[email protected]@Summary: Femoral nail (all types) versus sliding hip screw (SHS)@[email protected]@[email protected]@[email protected]@[email protected] [email protected]@O'Brien [email protected][email protected]@[email protected]" 
) 

Мы можем использовать count.fields(), чтобы просмотреть длины полей в файле. С нормальным sep = "@" и ничего, мы получим числовую апертуру между строками, и неправильных отсчетами

count.fields(textConnection(txt), sep = "@") 
# [1] 28 NA 24 

Но когда мы признаем разделитель новой строки в quote, он возвращает правильные длины

count.fields(textConnection(txt), sep = "@", quote = "\n") 
# [1] 28 28 

So , Я рекомендую добавить quote = "\n" к вашему звонку read.table и посмотреть, разрешит ли он его. Это сделало для меня

read.table(text = txt, sep = "@") 
# [1] V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24 V25 V26 V27 V28 
# <0 rows> (or 0-length row.names) 

df <- read.table(text = txt, sep = "@", quote = "\n") 
dim(df) 
# [1] 2 28 
anyNA(df) 
# [1] FALSE 
+0

Спасибо, это была проблема. – user3821273

+0

Я не уверен, почему. У меня есть догадка, потому что некоторые из этих подстрок выглядят как unicode hexdigit, но я не уверен. –

1

У меня была эта проблема. Этот ответ помог, но quote = "\ n" работал только до точки. Был элемент в файле, который имел " как характер, так что мне пришлось использовать по умолчанию для цитаты. Я также имел # в одном из элементов, так что я должен был использовать comment.char = «». помощь для read.table() ссылки сканирования() в паре мест, так что я проверил его и нашел allowEscapes аргумент, который имеет ложных по умолчанию. Я добавил, что к моему read.table() позвоните и установите его в True.Вот полная команда, которая сработала для меня: read.table (file = "filename.csv", header = T, sep = ",", comment.char = "", allowEscapes = T) Надеюсь, это помогает кому-то.

+0

Это помогло мне собраться. comment.char = "" - это путь. –

Смежные вопросы