Опция Fill для fread

Скажем, у меня есть этот txt файл:

"AA",3,3,3,3
"CC","ad",2,2,2,2,2
"ZZ",2
"AA",3,3,3,3
"CC","ad",2,2,2,2,2

С read.csv я могу:

> read.csv("linktofile.txt", fill=T, header=F)
  V1 V2 V3 V4 V5 V6 V7
1 AA  3  3  3  3 NA NA
2 CC ad  2  2  2  2  2
3 ZZ  2 NA NA NA NA NA
4 AA  3  3  3  3 NA NA
5 CC ad  2  2  2  2  2

Однако fread дает

> library(data.table)

> fread("linktofile.txt")
   V1 V2 V3 V4 V5 V6 V7
1: CC ad  2  2  2  2  2

Можно ли получить тот же результат с помощью fread?

Ответ 1

В настоящий момент нет; Я не знал о функции read.csv fill. В плане было добавить возможность читать файлы с двойным ограничением (sep2, а также sep, как указано в ?fread). Затем векторы переменной длины можно было прочитать в столбце list, где каждая ячейка сама была вектором. Но, не заполняя NA.

Не могли бы вы добавить его в список, пожалуйста? Таким образом вы получите уведомление, когда его статус изменится.

Есть ли много нерегулярных форматов данных, подобных этому? Я только вспоминаю, когда-либо видели обычные файлы, где неполные строки считались ошибкой.

ОБНОВЛЕНИЕ: очень маловероятно. fread оптимизирован для файлов с постоянным ограничением (где каждая строка имеет одинаковое количество столбцов). Однако нерегулярные файлы могут быть прочитаны в столбцах list (каждая ячейка сама является вектором), когда sep2 реализована; не заполненные отдельными столбцами, поскольку read.csv может выполнять.

Ответ 2

Основное обновление

Похоже, что планы развития для fread изменены и fread теперь получил аргумент fill.

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

library(data.table)
packageVersion("data.table")
# [1] ‘1.9.7’
fread(x, fill = TRUE)
#    V1 V2 V3 V4 V5 V6 V7
# 1: AA  3  3  3  3 NA NA
# 2: CC ad  2  2  2  2  2
# 3: ZZ  2 NA NA NA NA NA
# 4: AA  3  3  3  3 NA NA
# 5: CC ad  2  2  2  2  2

Установите версию разработки "data.table" с помощью:

install.packages("data.table", 
                 repos = "https://Rdatatable.github.io/data.table", 
                 type = "source")

Оригинальный ответ

Это не отвечает на ваш вопрос о fread: этот вопрос уже рассмотрен @Matt.

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

В отличие от fread, вам придется немного помочь этим функциям, предоставив им некоторую информацию о данных, которые вы пытаетесь прочитать.

Вы можете использовать функцию input.file из "iotools". Указав типы столбцов, вы можете указать функции форматирования, сколько столбцов следует ожидать.

library(iotools)
input.file(x, formatter = dstrsplit, sep = ",",
           col_types = rep("character", max(count.fields(x, ","))))

Пример данных

x <- tempfile()
myvec <- c('"AA",3,3,3,3', '"CC","ad",2,2,2,2,2', '"ZZ",2', '"AA",3,3,3,3', '"CC","ad",2,2,2,2,2')
cat(myvec, file = x, sep = "\n")

## Uncomment for bigger sample data
## cat(rep(myvec, 200000), file = x, sep = "\n")