R使用map_df合并csv数据集时double与character类型冲突如何解决
问题根源
你遇到的类型合并报错核心原因是部分文件中HourlyWetBulbTemperature列用*表示缺失值,默认的read_csv无法识别*为缺失值,会将整列强制转为字符型,和其他文件中同列的数值型冲突。你之前触发的Names repair functions can't return NA values报错,是因为将类型转换函数错误传递给了map_df/read_csv的名称修复参数位,而非在读取后处理列。
解决方案
有两种可行方案,均通过在map_df内嵌套匿名函数实现单文件先处理再合并,避免类型冲突:
方案1:直接识别*为缺失值(优先推荐)
在read_csv参数中新增na配置,将*加入缺失值识别列表,读取时直接将*转为NA,保持所有数值列的类型统一:
library(rnoaa) library(tidyverse) library(fs) super_big_df <- map_df(my_files, function(file_path) { read_csv( file = file_path, col_select = c(1,2,21,32,80), col_types = "cTddd", na = c("", "NA", "*") # 新增行,将*识别为缺失值 ) }, .id = "file")
方案2:先统一读为字符型再转换类型(兼容性更强)
如果你的文件还存在其他异常字符导致类型识别错误,可以先将所有列读为字符型,再统一转换为目标类型,彻底避免合并时的类型冲突:
library(rnoaa) library(tidyverse) library(fs) super_big_df <- map_df(my_files, function(file_path) { # 第一步全部读取为字符型,消除读取阶段的类型差异 df_raw <- read_csv( file = file_path, col_select = c(1,2,21,32,80), col_types = "ccccc", na = c("", "NA", "*") ) # 第二步统一转换为目标类型 df_clean <- df_raw %>% mutate( STATION = as.character(STATION), DATE = as.POSIXct(DATE, tz = "UTC"), HourlyWetBulbTemperature = as.numeric(HourlyWetBulbTemperature), DailyAverageWetBulbTemperature = as.numeric(DailyAverageWetBulbTemperature), MonthlyWetBulb = as.numeric(MonthlyWetBulb) ) return(df_clean) }, .id = "file")
两种方案都可以保证所有文件的同列类型完全一致,不会再触发合并报错。
内容的提问来源于stack exchange,提问作者Gabriela Nagle
相关产品推荐
相关产品推荐

