递归导入嵌套CSV空气质量数据并添加房屋房间等标识列
解决嵌套CSV文件的信息提取与合并问题
我来帮你搞定这个问题——要从嵌套文件夹和文件名里提取房屋编号、房间名称、月份、年份信息,再和空气质量数据合并成带溯源标识的data.frame,咱们可以用更清晰可靠的步骤实现,避开你之前尝试里的小问题:
完整可运行代码
library(tidyverse) # 1. 递归获取所有CSV文件的完整路径 filenames <- list.files(pattern = "*.csv", full.names = TRUE, recursive = TRUE) # 2. 从文件名中精准提取关键标识信息 file_info <- str_match(filenames, "House (\\d+) ([a-z\\s]+) ([A-Za-z]+) (\\d{4})\\.csv") %>% as_tibble() %>% select( houseNum = V2, roomName = V3, month = V4, year = V5 ) %>% # 把房间名称统一为首字母大写格式(可选,按需调整) mutate(roomName = str_to_title(roomName)) # 3. 读取CSV并绑定标识列,合并为最终数据框 all_data <- map2_dfr(filenames, seq_along(filenames), function(file, idx) { # 读取CSV文件,若你的CSV列名有特殊格式可在此调整参数 read_csv(file) %>% # 添加提取的标识列,放在最前面方便查看 mutate( houseNum = file_info$houseNum[idx], roomName = file_info$roomName[idx], month = file_info$month[idx], year = file_info$year[idx], .before = 1 ) }) # 可选:将月份+年份转换为日期格式,方便后续绘图分析 all_data <- all_data %>% mutate(date = as.Date(paste(month, year, "01"), "%B %Y %d"))
代码分步解释
- 步骤1:
list.files递归遍历所有嵌套文件夹,获取每个CSV的完整路径,确保不会遗漏任何文件。 - 步骤2:用正则表达式直接从文件名提取信息,比依赖文件夹路径更准确:
House (\\d+):匹配房屋编号(比如01、02)([a-z\\s]+):匹配房间名称(比如kitchen、living room)([A-Za-z]+):匹配月份(比如Apr、December)(\\d{4}):匹配4位年份(比如2019)
最后整理成规范的列,还可以统一房间名的大小写格式。
- 步骤3:用
map2_dfr同时遍历文件名和索引,读取每个CSV的同时绑定对应的标识列,一步到位合并成大的data.frame,比先存列表再合并更高效。 - 可选步骤:把月份和年份转成日期格式,方便后续做时间序列绘图、按年月筛选数据等操作。
结果验证
运行代码后,用head(all_data)查看,会得到包含以下列的data.frame:houseNum, roomName, month, year, date(可选),加上你CSV里的原始监测列(Time、pm2.5、Temp等),完全满足绘图时的数据溯源需求。
内容的提问来源于stack exchange,提问作者HCAI
相关产品推荐
相关产品推荐

