Я пытаюсь прочитать большое количество данных (до 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"))