Ошибка в read.fwf, когда заголовок = TRUE

Я смоделировал данные, которые выглядят так:

LastName   Date      email                                                    CreditCardNum   AgeZip  Amount
Paul       21/02/14  [email protected]                     4241033422900360 6738851$14.39
Bullock      2/7/[email protected]                     5178789953524240 3336538$498.31
Mcmahon     11/5/[email protected]                              5389589582467450 7734302$92.44
Walters    25/09/13  [email protected]                       5157094536097720 7794007$206.60
Franco     17/06/13  [email protected]                                 345477952996264 2415873$89.12

и вот как я пытаюсь импортировать его в R с заголовками:

w <- c(11,10,57,16,3,5,8)
df <- read.fwf("data.txt",widths=w,stringsAsFactors=F)
names(df) <- df[1,]; df <- df[-1,]

Причина, по которой я не использую header=T, заключается в том, что это дает мне ошибку:

Error in read.table(file = FILE, header = header, sep = sep, row.names = row.names,  :  more columns than column names

что просто неправда. Я знаю, что ширина (w) верна. Так откуда эта ошибка? Мое решение работает нормально, я просто хотел бы понять, что происходит.


person shadowtalker    schedule 06.02.2014    source источник
comment
Не могли бы вы предоставить свой вектор w, чтобы он был (более) воспроизводимым?   -  person jbaums    schedule 06.02.2014
comment
Да, извините: w <- c(11,10,57,16,3,5,8). Отредактировано.   -  person shadowtalker    schedule 06.02.2014
comment
Мне немного неясно, в чем заключается ваш вопрос. Вы хотели знать, почему возникает ошибка? или вы искали элегантный обходной путь? Предложенный вами метод указания header=F выглядит нормально.   -  person jbaums    schedule 06.02.2014
comment
Мне интересно, почему ошибка возникает в первую очередь. Еще раз отредактировал.   -  person shadowtalker    schedule 06.02.2014
comment
Ну, это потому, что вам нужно убедиться, что ваша строка заголовка соответствует спецификации sep, которая по умолчанию равна \t. У вас нет.   -  person jbaums    schedule 06.02.2014


Ответы (1)


Если вы укажете header=TRUE, то, согласно ?read.fwf, вы должны убедиться, что имена столбцов разделены sep. По умолчанию имена разделяются \t (символом табуляции), и это не должно быть верно для ваших данных.

Следующее работает отлично:

w <- c(11, 10, 57, 16, 3, 5, 8)

read.fwf(widths=w, header=TRUE, sep='|', 
file=textConnection('LastName   |Date      |email                                                    |CreditCardNum   |Age|Zip  |Amount
Paul       21/02/14  [email protected]                     4241033422900360 6738851$14.39
Bullock      2/7/[email protected]                     5178789953524240 3336538$498.31
Mcmahon     11/5/[email protected]                              5389589582467450 7734302$92.44
Walters    25/09/13  [email protected]                       5157094536097720 7794007$206.60
Franco     17/06/13  [email protected]                                 345477952996264 2415873$89.12'))
person jbaums    schedule 06.02.2014
comment
Мне было интересно, для чего должен был использоваться аргумент sep в read.fwf(). Типа побеждает цель imo. В любом случае, я надеялся на решение, которое не требовало бы от меня изменения фактических данных, даже если изменение небольшое и его можно было бы легко автоматизировать. Также обратите внимание, что w отличается от того, что вы (оправданно) предполагали; см. мой комментарий выше. - person shadowtalker; 06.02.2014
comment
Только что заметил, что я совместил возраст и почтовый индекс. Я отредактирую свой пост. У меня также сложилось впечатление, что заголовки данных fwf обычно имеют ту же ширину, что и последующие строки, поэтому я согласен с вами по поводу избыточности. - person jbaums; 06.02.2014
comment
Они одинаковой ширины, просто интервалы не совпадают. После этого шага я обрезаю начальные и конечные пробелы. - person shadowtalker; 06.02.2014
comment
@ssdecontrol: Ах, извините, я не комментировал ваши данные. Я имел в виду, что, поскольку столбцы заголовков fwf обычно имеют ту же ширину, что и столбцы последующих строк, аргумент sep обычно является избыточным. - person jbaums; 06.02.2014
comment
Просто ударил по этой проблеме - думал, что схожу с ума, пока не наткнулся на этот вопрос. Я не могу представить, что это было то, что было задумано! - person thelatemail; 27.10.2016
comment
@thelatemail - да, это кажется довольно странным - person jbaums; 27.10.2016