You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 06:09:05