Подтвердить что ты не робот

Предотвращение вывода класса столбцов в fread()

Есть ли способ для fread, чтобы имитировать поведение read.table, при котором class переменной задается с помощью данных, которые читаются.

У меня есть числовые данные с несколькими комментариями под основными данными. Когда я использую fread для чтения в данных, столбцы преобразуются в символ. Однако, установив nrow в read.table`, я могу остановить это поведение. Возможно ли это в страхе. (Я бы предпочел не изменять исходные данные или не вносить исправленную копию). Благодаря

Пример

d <- data.frame(x=c(1:100, NA, NA, "fff"), y=c(1:100, NA,NA,NA)) 
write.csv(d, "test.csv",  row.names=F)

in_d <- read.csv("test.csv", nrow=100, header=T)
in_dt <- data.table::fread("test.csv", nrow=100)

Что производит

> str(in_d)
'data.frame':   100 obs. of  2 variables:
 $ x: int  1 2 3 4 5 6 7 8 9 10 ...
 $ y: int  1 2 3 4 5 6 7 8 9 10 ...
> str(in_dt)
Classes ‘data.table’ and 'data.frame':  100 obs. of  2 variables:
 $ x: chr  "1" "2" "3" "4" ...
 $ y: int  1 2 3 4 5 6 7 8 9 10 ...
 - attr(*, ".internal.selfref")=<externalptr>

В качестве обходного решения я подумал, что смогу использовать read.table для чтения в одной строке, получить класс и установить colClasses, но я не понимаю.

cl <- read.csv("test.csv", nrow=1,  header=T)
cols <- unname(sapply(cl, class))
in_dt <- data.table::fread("test.csv", nrow=100, colClasses=cols)
str(in_dt)

Использование Windows8.1 R 3.1.2 (2014-10-31) Платформа: x86_64-w64-mingw32/x64 (64-разрядная версия)

4b9b3361

Ответ 1

Вариант 1: Использование системной команды

fread() позволяет использовать системную команду в своем первом аргументе. Мы можем использовать его для удаления кавычек в первом столбце файла.

indt <- data.table::fread("cat test.csv | tr -d '\"'", nrows = 100)
str(indt)
# Classes ‘data.table’ and 'data.frame':    100 obs. of  2 variables:
#  $ x: int  1 2 3 4 5 6 7 8 9 10 ...
#  $ y: int  1 2 3 4 5 6 7 8 9 10 ...
#  - attr(*, ".internal.selfref")=<externalptr> 

Системная команда cat test.csv | tr -d '\"' объяснила:

  • cat test.csv считывает файл на стандартный вывод
  • | - это труба, используя вывод предыдущей команды в качестве ввода для следующей команды
  • tr -d '\"' удаляет (-d) все вхождения двойных кавычек ('\"') из текущего ввода

Вариант 2: Принуждение после прочтения

Поскольку вариант 1, похоже, не работает в вашей системе, другая возможность - прочитать файл так же, как вы, но преобразовать столбец x с type.convert().

library(data.table)
indt2 <- fread("test.csv", nrows = 100)[, x := type.convert(x)]
str(indt2)
# Classes ‘data.table’ and 'data.frame':    100 obs. of  2 variables:
#  $ x: int  1 2 3 4 5 6 7 8 9 10 ...
#  $ y: int  1 2 3 4 5 6 7 8 9 10 ...
#  - attr(*, ".internal.selfref")=<externalptr> 

Боковое примечание: Я обычно предпочитаю использовать type.convert() над as.numeric(), чтобы избежать появления в некоторых случаях предупреждений "NA, введенных принуждением". Например,

x <- c("1", "4", "NA", "6")
as.numeric(x)
# [1]  1  4 NA  6
# Warning message:
# NAs introduced by coercion 
type.convert(x)
# [1]  1  4 NA  6

Но, конечно, вы можете использовать as.numeric().


Примечание: Этот ответ предполагает data.table dev v1.9.5

Ответ 2

Хорошо, клиент злоупотребляет CSV-форматом, чтобы преднамеренно записать строки строки с завершающим строком в целочисленный столбец, но без этих строк, начиная с comment.char(#).

Затем вы как-то ожидаете, что можете переопределить вывод типа fread(), чтобы прочитать их как integer, используя nrow, чтобы попытаться ограничить его, чтобы просто увидеть целые строки. read.csv(..., nrow) будет принимать это, однако fread() всегда использует все строки для ввода типа (а не только те, которые указаны nrow, skip, header), и даже если они начинаются с comment.char(это ошибка).

  • Звучит как злоупотребление CSV. Строки комментариев должны быть добавлены с помощью #
  • Да, fread() требуется исправление/усиление, чтобы игнорировать строки комментариев для вывода типа.
  • В настоящее время вы можете обойтись с помощью fread(), выполнив последующую обработку таблицы данных.
  • Возможно, необходимо изменить fread(), чтобы поддерживать поведение, которое вы хотите: используя nrows, чтобы ограничить доступ к типу вывода. Он может исправить ваш (довольно уникальный) случай и сломать некоторые другие.

Я не понимаю, почему вы (EDIT: клиент) не можете писать свои комментарии в отдельный файл .txt/README/data-dictionary, чтобы сопровождать .csv. Практика использования отдельного файла словаря данных довольно хорошо известна. Я никогда не видел, чтобы кто-то делал это в CSV файле. По крайней мере, переместите комментарии в заголовок, а не в нижний колонтитул.