2013-10-08 2 views
7

Может ли fread из« data.table »быть принудительно успешно использован "." как значение sep?Использование sep = "." в `fread` из« data.table »

Я пытаюсь использовать fread для ускорения моих concat.split функций в "splitstackshape". См. this Gist для общего подхода, который я принимаю, и this question за то, почему я хочу сделать переключатель.

Проблема, с которой я сталкиваюсь, обрабатывает точку (".") в качестве значения для sep. Всякий раз, когда я это делаю, я получаю ошибку «неожиданного персонажа».

Следующий упрощенный пример демонстрирует проблему.

library(data.table) 

y <- paste("192.168.1.", 1:10, sep = "") 

x1 <- tempfile() 
writeLines(y, x1) 
fread(x1, sep = ".", header = FALSE) 
# Error in fread(x1, sep = ".", header = FALSE) : Unexpected character (
# 192) ending field 2 of line 1 

Обходной у меня в текущей функции заменить "." с другим персонажем, который, мы надеемся, нет в исходных данных, говорят "|", но кажется, что рискованно для меня, так как я не могу предсказать, что в чужой набор данных. Вот обходной путь в действии.

x2 <- tempfile() 
z <- gsub(".", "|", y, fixed=TRUE) 
writeLines(z, x2) 
fread(x2, sep = "|", header = FALSE) 
#  V1 V2 V3 V4 
# 1: 192 168 1 1 
# 2: 192 168 1 2 
# 3: 192 168 1 3 
# 4: 192 168 1 4 
# 5: 192 168 1 5 
# 6: 192 168 1 6 
# 7: 192 168 1 7 
# 8: 192 168 1 8 
# 9: 192 168 1 9 
# 10: 192 168 1 10 

Для целей этого вопроса, предположим, что данные сбалансированы (каждая строка будет иметь такое же количество «sep» символов). Я знаю, что использование "." в качестве разделителя - не самая лучшая идея, но я просто пытаюсь объяснить, что другие пользователи могут иметь в своих наборах данных, на основе otherquestionsI've answered здесь, на SO.

+0

Я не смотрел много на источник для 'fread', поэтому не просить очевидного, но вы попытались выйти из' \\. '? –

+0

@ RicardoSaporta, да. Вы получите сообщение об ошибке: «Ошибка в fread (x1, sep =« \\. », Header = FALSE):« sep »должен быть« авто »или одним символом». – A5C1D2H2I1M1N2O1R2T1

+0

Я только что заметил, что после моего комментария. хм ... Я понятия не имею. Может быть, @MattDowle может перезвонить? –

ответ

3

Сейчас реализуется в v1.9.5 на GitHub.

> input = paste(paste("192.168.1.", 1:5, sep=""), collapse="\n") 
> cat(input,"\n") 
192.168.1.1 
192.168.1.2 
192.168.1.3 
192.168.1.4 
192.168.1.5 

Настройка sep='.' результатов в неясности с новым аргументом dec (по умолчанию '.'):

> fread(input,sep=".") 
Error in fread(input, sep = ".") : 
    The two arguments to fread 'dec' and 'sep' are equal ('.') 

Поэтому выбрать что-то еще для dec:

> fread(input,sep=".",dec=",") 
    V1 V2 V3 V4 
1: 192 168 1 1 
2: 192 168 1 2 
3: 192 168 1 3 
4: 192 168 1 4 
5: 192 168 1 5 

Вы можете получить предупреждение:

> fread(input,sep=".",dec=",") 
    V1 V2 V3 V4 
1: 192 168 1 1 
2: 192 168 1 2 
3: 192 168 1 3 
4: 192 168 1 4 
5: 192 168 1 5 
Warning message: 
In fread(input, sep = ".", dec = ",") : 
    Run again with verbose=TRUE to inspect... Unable to change to a locale 
    which provides the desired dec. You will need to add a valid locale name 
    to getOption("datatable.fread.dec.locale"). See the paragraph in ?fread. 

Либо игнорировать или подавлять предупреждение, или прочитать абзац и установите опцию:

options(datatable.fread.dec.locale = "fr_FR.utf8") 

Это гарантирует, что не может быть никакой двусмысленности.

0

< это длинный комментарий, а не ответ>

Этот вопрос швы должны быть связаны с числовым значением самого текста.

library(data.table) 

y <- paste("Hz.BB.GHG.", 1:10, sep = "") 

xChar <- tempfile() 
writeLines(y, xChar) 
fread(xChar, sep = ".", header = FALSE) 
#  V1 V2 V3 V4 
# 1: Hz BB GHG 1 
# 2: Hz BB GHG 2 
# 3: Hz BB GHG 3 
# 4: Hz BB GHG 4 
# 5: Hz BB GHG 5 
# 6: Hz BB GHG 6 
# 7: Hz BB GHG 7 
# 8: Hz BB GHG 8 
# 9: Hz BB GHG 9 
# 10: Hz BB GHG 10 

Однако, пытаясь с первоначальным значением, снова дает ту же ошибку,

fread(x1, sep = ".", header = FALSE, colClasses="numeric", verbose=TRUE) 
fread(x1, sep = ".", header = FALSE, colClasses="character", verbose=TRUE) 

Detected eol as \n only (no \r afterwards), the UNIX and Mac standard. 
Looking for supplied sep '.' on line 10 (the last non blank line in the first 'autostart') ... found ok 
Found 4 columns 
First row with 4 fields occurs on line 1 (either column names or first row of data) 
Error in fread(x1, sep = ".", header = FALSE, colClasses = "character", : 
    Unexpected character (192.) ending field 2 of line 1 

Это, однако, делает работу:

read.table(x1, sep=".") 
#  V1 V2 V3 V4 
# 1 192 168 1 1 
# 2 192 168 1 2 
# 3 192 168 1 3 
# 4 192 168 1 4 
# ... <cropped> 
+0

Хммм. Это интересно. По расширению, если бы мы имели 'y <- paste (" Hz.BB.GHG. ", 1:10, 11:20, sep =" ")', снова мы получили бы ошибку. Любая идея почему? – A5C1D2H2I1M1N2O1R2T1

+0

Что касается вашего редактирования ('read.table'), это то, что я сейчас использую в одной из версий' concat.split'. См. Раздел «splitstackshape ::: read.concat». – A5C1D2H2I1M1N2O1R2T1

+1

Это почти 7 утра в Лондоне, я не знаю, что Мэтт не делает на stackoverflow;) Удачи в этом, я ухожу (я удалю этот ответ утром) –

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