使用R清理批量CSV数据的流程疑问与mutate函数报错咨询
问题核心原因
dplyr::mutate()必须传入要操作的数据框作为第一个参数,你写的mutate(id = file)没有指定操作对象temp,所以触发.data缺失的报错- 循环内的计算结果都没有赋值给变量,也没有追加到最终输出的数据集,跑完循环也无法得到合并后的结果
- 步骤顺序建议调整为:读取数据→统一表头→加文件ID→筛选需要的列→过滤行→分组求和→合并所有文件结果,这样逻辑更顺,不会出现ID对应错位的问题
表头处理说明
两种方案都可以,按你的场景选即可:
- 如果原文件第四行的表头本身就是规范的,直接用
skip=3, header=T即可,不需要额外重赋值 - 如果原表头命名不规范、或者你要统一成自定义的列名,就保留你现在的手动重赋值列名的逻辑即可
修正后完整代码
# 加载包,tidyverse已经包含dplyr,不需要重复加载 library(tidyverse) # 读取所有csv文件路径 files <- list.files(pattern = "*.csv", full.names = TRUE) # 初始化结果列表,比循环中逐行追加数据框效率更高 result_list <- list() for (i in seq_along(files)) { file_path <- files[i] # 1. 读取数据,跳过前3行 temp <- read.csv(file_path, skip = 3, header = TRUE) # 2. 统一自定义列名(如果你不需要改原表头可以删掉这行) colnames(temp) <- c("Volume", "Unit", "Category", "Surpass Object", "Time", "ID") # 3. 新增文件ID列,用basename()只保留文件名,过滤掉路径前缀 temp <- mutate(temp, file_id = basename(file_path)) # 4. 提取需要的4列(你之前的代码只选了3列,按需补全对应列名即可) temp <- select(temp, Volume, Category, `Surpass Object`, file_id) # 5. 过滤Category为Surface的行 temp <- filter(temp, Category == "Surface") # 6. 按需求分组求和,如果需要每个文件单独统计就保留file_id分组,要全局汇总可以删掉 temp_sum <- group_by(temp, Category, file_id) %>% summarise(total_volume = sum(Volume, na.rm = TRUE), .groups = "drop") # 存入结果列表 result_list[[i]] <- temp_sum } # 合并所有文件的结果 final_data <- bind_rows(result_list) # 导出合并后的文件 write.csv(final_data, "合并结果.csv", row.names = FALSE)
如果你的求和是要所有文件合并后全局统计,只需要把分组求和的逻辑放到合并完final_data之后再执行即可。
内容的提问来源于stack exchange,提问作者Meifong
相关产品推荐
相关产品推荐

