Опция 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")