在R中批量加载CSV文件并从文件名生成新变量的优化实现
批量加载CSV并合并的简化方案
不用创建多个中间对象,直接通过单条管道链就能完成所有操作,核心思路是一次性获取所有目标CSV文件路径,读取时同步提取collar_id并合并:
方法一:从子文件夹名称提取collar_id
适用于你的文件结构(每个项圈对应单独子文件夹):
library(tidyverse) # 一次性读取所有子文件夹下的CSV,自动添加collar_id列 accel_data <- list.files(path = "data/Accel2024", pattern = "\\.csv$", # 精准匹配CSV文件 full.names = TRUE, recursive = TRUE) %>% # 遍历所有子文件夹 map_dfr(~ read_csv(.x, skip = 4) %>% mutate(collar_id = basename(dirname(.x)))) # 从父文件夹名提取项圈编号
方法二:从文件名提取collar_id
如果collar_id直接包含在CSV文件名中(比如accel_1305_01.csv),可以用正则提取:
accel_data <- list.files("data/Accel2024", "\\.csv$", full.names = TRUE, recursive = TRUE) %>% map_dfr(~ read_csv(.x, skip = 4) %>% mutate(collar_id = str_extract(basename(.x), "\\d{4}"))) # 提取文件名中的4位数字ID
说明
list.files(recursive = TRUE)会自动遍历data/Accel2024下的所有子文件夹,无需单独处理每个项圈目录map_dfr会自动把所有读取的表格按行合并成一个tibble- 新增的
collar_id列直接嵌入合并流程,全程无中间对象生成
最终得到的accel_data结构和你期望的一致:
# 示例结构 data.frame(collar_id = c("1305", "1306"), time = c("0615", "0819"), x = c(31, 16), y = c(-5, 6), z = c(6, 5))
内容的提问来源于stack exchange,提问作者SarahLou
相关产品推荐
相关产品推荐

