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

R中列类型不同的多个CSV文件如何合并为单个DataFrame

R批量合并CSV字段类型不匹配+时间转换NA解决方案

问题根源

  1. 你原有代码中指定read_csv的col_types时用started_at = "T",readr会调用默认时间格式解析所有文件的该列,只要任意一个文件的时间字符串格式和默认格式不匹配,就会返回NA
  2. 用assign循环生成多个临时df再手动rbind的方式效率低,且你原有代码仅合并了前3个文件,剩余9个文件未纳入最终数据集
  3. 你最初打算先全转字符再调整类型的思路反而是最合理的:不同CSV同名字段存储格式不一致,读阶段强制指定类型必然会因为格式不兼容出问题,先统一读为字符型再批量转换才能兼容所有差异

代码实现

# 加载依赖包
library(tidyverse)
library(lubridate)

# 批量获取所有CSV完整路径
file_dir <- "D:/OneDrive/Documents/01_CyclisticBike_BikeTripData_202011-202110_v1/RMarkdown_notes/TripData/"
csv_files <- list.files(path = file_dir, pattern = "\\.csv$", full.names = TRUE)

# 批量读取所有文件,所有列先统一读为字符型,直接合并为一个数据框
bikeTrip <- map_dfr(csv_files, ~ read_csv(.x, col_types = cols(.default = "c")))

# 统一转换各字段类型
bikeTrip <- bikeTrip %>%
  mutate(
    # 转换时间列,参数orders指定所有可能出现的时间格式,会自动匹配解析
    started_at = parse_date_time(started_at, orders = c("Ymd HMS", "Ymd HM", "Y/m/d HM", "mdy HMS", "dmy HMS")),
    ended_at = parse_date_time(ended_at, orders = c("Ymd HMS", "Ymd HM", "Y/m/d HM", "mdy HMS", "dmy HMS")),
    # 转换站点ID,若存在带字母的ID,删掉as.integer()转换,保留字符型即可
    start_station_id = as.integer(start_station_id),
    end_station_id = as.integer(end_station_id)
  )

注意事项

  • 如果转换后仍有NA值,可提取NA对应的原始时间字符串,将对应的格式补充到parse_date_time的orders参数中即可
  • 若站点ID存在ST0012这类带字母的编号,不要转整数,直接保留字符型避免生成NA

内容的提问来源于stack exchange,提问作者Gayatri Lavanya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 08:06:03