R中列类型不同的多个CSV文件如何合并为单个DataFrame
R批量合并CSV字段类型不匹配+时间转换NA解决方案
问题根源
- 你原有代码中指定
read_csv的col_types时用started_at = "T",readr会调用默认时间格式解析所有文件的该列,只要任意一个文件的时间字符串格式和默认格式不匹配,就会返回NA - 用
assign循环生成多个临时df再手动rbind的方式效率低,且你原有代码仅合并了前3个文件,剩余9个文件未纳入最终数据集 - 你最初打算先全转字符再调整类型的思路反而是最合理的:不同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
相关产品推荐
相关产品推荐

