如何在fread的select/check.names后设置colClasses以保留前导零?
关于data.table::fread处理大体积异构CSV的列类型与筛选问题
我现在要处理一批异构数据,最多有100个文件,单个文件能达到1.5GB,为了速度考虑选了data.table::fread,但碰到了几个绕不开的问题:
- 源数据有重复列名,而且我没法控制源数据的格式;
- ID这类列必须保留前导零,所以得直接按字符/因子类型导入,不能等导入后再转换;
- 我只需要部分列,数据量太大,全量导入再筛选太浪费资源;
- 每个文件的列数和列名都略有差异,得用正则匹配目标列,最后得到固定数量的列。
我本来的思路是先读取所有列名,用正则筛选出目标列,再通过fread的select参数导入指定列。但发现colClasses是在select/check.names之前生效的,哪怕用命名列表也匹配不上处理后的列名。想请教一下,有没有办法在select/check.names之后再设置colClasses,同时还能保留前导零?
我试过一些相关的colClasses设置方法,但都适配不了我的异构文件场景。
可复现示例代码
# 创建测试数据 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)) # 假设grp是自定义的正则匹配函数,用于筛选符合规则的列 ColNos <- grp(c("ID|HH.1|MM.1|Precip"), Colnames) # 成功导入但丢失前导零 dat <- fread("test.csv", check.names = T, select = ColNos) # 提示colClasses数量不匹配,无法为所有列设置类型(文件列差异大) dat <- fread("test.csv", check.names = T, select = ColNos, colClasses = c("character","character","character","numeric")) # 无法匹配处理后的列名,比如HH.1,且Precip列名不固定(有时是Precipy/Precipz) dat<- fread("test.csv", check.names = T, select = ColNos, colClasses = c("ID" = "character","HH.1" = "character","MM.1" = "character","Precipx" = "numeric"))
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

