如何在R中对同类CSV文件重复执行数据分析步骤
批量处理月度Divvy骑行数据的高效方案
你当前重复复制粘贴的方式不仅低效,还容易引入人为错误。可以通过封装重复逻辑为函数 + 批量遍历文件的方式解决,以下是具体实现:
步骤1:准备工作
首先安装并加载tidyverse包(包含数据处理、批量操作、字符串处理所需的工具):
install.packages("tidyverse") library(tidyverse)
步骤2:自动获取目标文件路径
用list.files匹配符合命名规则的CSV文件,无需手动输入文件名:
# 匹配2022年月度数据文件的正则表达式 file_paths <- list.files( pattern = "^2022\\d{2}-divvy-tripdata\\.csv$", full.names = TRUE # 返回完整文件路径 )
步骤3:封装单文件处理逻辑
把单月数据的操作写成函数,输入为文件路径,输出为该月份的统计结果:
process_month_data <- function(file_path) { # 读取数据 raw_data <- read.csv(file_path) # 从文件名提取月份标识(如202201) month_id <- stringr::str_extract(file_path, "2022\\d{2}") # 计算骑行时长并按会员类型统计 monthly_stats <- raw_data %>% select(member_casual, started_at, ended_at) %>% mutate( ride_length = difftime(ended_at, started_at, units = "mins"), month = month_id ) %>% group_by(member_casual, month) %>% summarise( mean_ride_mins = mean(ride_length, na.rm = TRUE), # 忽略缺失值 total_ride_mins = sum(ride_length, na.rm = TRUE), .groups = "drop" # 取消分组 ) return(monthly_stats) }
步骤4:批量处理所有文件
用map_dfr批量执行函数,并自动将所有结果合并为一个结构化数据框:
# 批量处理并合并结果 all_monthly_stats <- map_dfr(file_paths, process_month_data) # 查看最终统计数据 print(all_monthly_stats)
替代方案:基础R实现(无需tidyverse)
如果不想使用tidyverse,可以用基础R语法实现相同逻辑:
# 定义基础R版处理函数 process_month_data_base <- function(file_path) { raw_data <- read.csv(file_path) # 从文件名提取月份 month_id <- sub("^(2022\\d{2})-.*", "\\1", basename(file_path)) # 计算骑行时长 raw_data$ride_length <- difftime(raw_data$ended_at, raw_data$started_at, units = "mins") # 分别统计会员与非会员数据 member_stats <- subset(raw_data, member_casual == "member") casual_stats <- subset(raw_data, member_casual == "casual") # 组合结果 result <- rbind( data.frame( member_casual = "member", month = month_id, mean_ride_mins = mean(member_stats$ride_length, na.rm = TRUE), total_ride_mins = sum(member_stats$ride_length, na.rm = TRUE) ), data.frame( member_casual = "casual", month = month_id, mean_ride_mins = mean(casual_stats$ride_length, na.rm = TRUE), total_ride_mins = sum(casual_stats$ride_length, na.rm = TRUE) ) ) return(result) } # 批量处理并合并 all_month_list <- lapply(file_paths, process_month_data_base) all_monthly_stats_base <- do.call(rbind, all_month_list)
方案优势
- 杜绝重复劳动:无需手动修改变量名和文件名,一次编写即可处理所有文件
- 逻辑易维护:后续调整统计规则(如增加骑行次数统计),仅需修改处理函数
- 结果结构化:合并后的统一数据框便于后续月度对比、可视化分析(如绘制会员/非会员的月度均值趋势图)
内容的提问来源于stack exchange,提问作者Phạm Duy Đức
相关产品推荐
相关产品推荐

