fread применить select и colClasses после check.names? - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь прочитать большое количество данных (до 100 файлов с размером до 1,5 ГБ каждый), которые имеют слегка раздражающий формат, и каждый из них немного различается.По соображениям скорости я хочу использовать data.table::fread, но у меня есть ряд проблем:

  • Входные данные (которые я не контролирую по формату) имеют несколько столбцов, названных одинаково
  • Столбец идентификатора (и, возможно, другие) выглядит как числовой, но на самом деле он представляет собой столбец символов или факторов - мне нужно оставить ведущие 0, поэтому я не могу просто вернуться после импорта
  • Мне нужны только некоторые столбцы, и с таким большим количеством данных я бы предпочел не импортировать, а затем отклонить
  • Каждый файл имеет несколько разные столбцы с номерами и именами.Нужные столбцы легко найти с помощью выражения регулярного выражения, и я всегда получу одинаковое количество.

Мой план атаки состоял в том, чтобы импортировать все столбцы и найти соответствующие столбцы с помощью регулярного выражения, а затем использоватьselect в этих столбцах в пределах fread.Но теперь я застрял с присвоением colClasses, так как они назначаются до выбора столбцов, а также до проверки имен, поэтому даже использование именованного списка не работает.Есть ли способ применить colClasses после select / check.names без потери моих начальных нулей?

Я попробовал методы столбцов именования из , используя colClasses в fread , а также Использование colClasses и одновременное выделение аргументов fread , но ни один из них не может справиться с различиями в моих файлах

Воспроизводимый пример:

dt <- data.frame(ID = c("01","02","03"), HH = 1:3, MM = rep(0,3), HH = 2:4, MM = rep(0,3),Precipx = rnorm(3),
             other1 = rep(0,3), other2 = rep(1,3),check.names = F)
write.csv(dt, "test.csv", row.names = F, quote = F)

Colnames <- names(fread("test.csv",nrows = 0 ,check.names = T))
ColNos <- grp(c("ID|HH.1|MM.1|$Precip"),Colnames)
#This import works, but I lose leading 0s
dat <- fread("test.csv", check.names = T, select = ColNos)

#This tells me I have the wrong number of `colClasses`, but I cannot set for all columns as varies file to file
dat <- fread("test.csv", check.names = T, select = ColNos, colClasses = c("character","charcter","character","numeric"))

#This doesn't recognise that I want the second HH column. Using just `"HH"` also has this problem
# and "Precipx" will sometimes be "Precipy", "Precipz"... in the file
dat<- fread("test.csv", check.names = T, select = ColNos, 
  colClasses = c("ID" = "character","HH.1" = "charcter","MM.1" = "character","Precipx" = "numeric"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...