使用tidyverse的read_csv读取文件时NA值解析报错如何解决
问题原因分析
- 解析报错的核心原因是
9am wind speed (km/h)列中存在你当前na参数未覆盖的非数值内容,导致col_double()无法正常解析:- 可能存在其他拼写形式的静风标识,例如全大写的
CALM、带空格的Calm等 - 可能存在其他缺失值标识,例如
-、N/A、空白字符等 - 部分数值可能附带多余字符,例如空格、单位后缀、特殊符号等
- 可能存在其他拼写形式的静风标识,例如全大写的
- 次要可能原因是不同CSV文件的头部行数不一致,固定
skip=7会导致部分文件把表头/说明行当做数据读入,引发类型解析错误 - 循环
rbind的方式也可能因为不同文件同列的解析类型不一致,触发合并报错
修复方案
步骤1:排查异常值
先将风速列临时指定为字符类型读取,查看所有唯一值定位异常内容:
# 临时修改列类型查看异常值 test_df <- read_csv("./data/你报错的文件名.csv", na = c('calm',"Calm"), skip =7, col_types = cols(`9am wind speed (km/h)` = col_character())) unique(test_df$`9am wind speed (km/h)`)
步骤2:优化读取与清洗逻辑
根据排查到的异常值,补充na参数列表,同时增加列清洗逻辑,修改后的函数如下:
library(tidyverse) generate_tibble <- function(filename) { temp_tibble <- read_csv( paste0("./data/", filename), # 补充所有你排查到的非数值缺失标识 na = c('calm',"Calm", "CALM", "NA", "N/A", "-", " ", "NaN"), skip = 7, col_types = cols( 'Date' = col_date(format = "%d/%m/%Y"), 'Evaporation (mm)' = col_double(), 'Sunshine (hours)' = col_double(), # 先读为字符类型做清洗 '9am wind speed (km/h)' = col_character() ) ) %>% # 移除风速列所有非数字、小数点的字符后转双精度类型 mutate(`9am wind speed (km/h)` = as.double(str_remove_all(`9am wind speed (km/h)`, "[^0-9.]"))) return(temp_tibble) }
步骤3:优化合并逻辑
放弃循环rbind,使用purrr::map_dfr批量读取并自动合并,避免手动合并的类型不匹配问题:
main_df <- map_dfr(file_names, generate_tibble)
如果仍然存在解析问题,可以直接打印problems(temp_tibble)查看具体报错的行号和异常内容,针对性处理即可。
内容的提问来源于stack exchange,提问作者Fazal Mahmud Niloy
相关产品推荐
相关产品推荐

