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

如何在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)

方案优势

  1. 杜绝重复劳动:无需手动修改变量名和文件名,一次编写即可处理所有文件
  2. 逻辑易维护:后续调整统计规则(如增加骑行次数统计),仅需修改处理函数
  3. 结果结构化:合并后的统一数据框便于后续月度对比、可视化分析(如绘制会员/非会员的月度均值趋势图)

内容的提问来源于stack exchange,提问作者Phạm Duy Đức

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:55:37