使用fread和file_list读取多CSV时将第26列设为字符类型报错求助
解决fread读取多CSV时电话号码列类型冲突的问题
错误原因
报错提示原文件第26列被识别为integer64类型,但你期望将其设为character类型,合并数据集时出现类型不匹配冲突。另外因为你使用了select参数筛选列,原文件第26列在筛选后的数据集里位置发生变化,导致之前指定colClasses的方式未生效。
可行解决方案
方案1:强制将所有integer64类型转为字符
直接在fread中添加integer64="character"参数,把所有被识别为integer64的列(包括电话号码列)读取为字符类型,从根源避免类型冲突:
SD_data <- data.table(NULL) file_list <- list.files(path = SD_Data_feed, pattern="ldn - Data.*\\.csv", ignore.case=TRUE) for (i in 1:length(file_list)){ temp_data <- fread(file.path(SD_Data_feed, file_list[i]), select = c(1:4,6:33), encoding = "UTF-8", integer64 = "character") # 新增此参数 SD_data <- unique(rbind(SD_data, temp_data)) }
方案2:读取后强制转换目标列(更精准)
先读取数据,再将筛选后的目标列转为字符类型。注意:原文件第26列在select筛选后的位置是25(因为跳过了原第5列),或者直接用列名更稳妥:
SD_data <- data.table(NULL) file_list <- list.files(path = SD_Data_feed, pattern="ldn - Data.*\\.csv", ignore.case=TRUE) for (i in 1:length(file_list)){ temp_data <- fread(file.path(SD_Data_feed, file_list[i]), select = c(1:4,6:33), encoding = "UTF-8") # 方法A:按位置转换(原26列对应筛选后的第25列) temp_data[, 25 := as.character(get(names(temp_data)[25]))] # 方法B:按列名转换(替换为你实际的电话号码列名) # temp_data[, phone_number := as.character(phone_number)] SD_data <- unique(rbind(SD_data, temp_data)) }
方案3:批量处理后合并(更高效)
用lapply批量处理所有文件,再一次性合并,更符合data.table的使用习惯:
file_paths <- file.path(SD_Data_feed, list.files(path = SD_Data_feed, pattern="ldn - Data.*\\.csv", ignore.case=TRUE)) SD_data <- rbindlist(lapply(file_paths, function(path) { dt <- fread(path, select = c(1:4,6:33), encoding = "UTF-8") # 转换目标列(这里用列名示例,替换为实际列名) dt[, phone_number := as.character(phone_number)] return(dt) }), use.names = TRUE, fill = TRUE) SD_data <- unique(SD_data)
内容的提问来源于stack exchange,提问作者David Cook
相关产品推荐
相关产品推荐

