R批量读取csv矩阵文件 上三角log10变换后加后缀保存
R语言批量处理矩阵CSV文件实现方案
核心处理逻辑:
- 自动识别工作目录下所有
.csv格式原始文件,自动跳过已生成的_log.csv结果文件避免重复处理 - 读取文件后严格仅对矩阵上三角区域的有效值执行
log10变换,完全保留下三角区域的0值不做修改 - 输出文件自动沿用原文件名主体,追加
_log.csv后缀后保存到原工作目录,不改动原始文件
# 1. 提取当前工作目录下所有原始csv文件 all_csv <- list.files(pattern = "\\.csv$") # 过滤掉已经生成的_log结果文件 raw_csv <- all_csv[!grepl("_log\\.csv$", all_csv)] # 2. 逐文件循环处理 for (f in raw_csv) { # 读取为矩阵格式,默认按无表头、无行名读取,保持90*90结构 mat <- as.matrix(read.csv(f, header = FALSE, check.names = FALSE)) # 定位上三角区域索引:diag=FALSE表示不包含对角线,若对角线需做变换改为TRUE即可 upper_pos <- upper.tri(mat, diag = FALSE) # 仅对上三角元素执行log10变换 mat[upper_pos] <- log10(mat[upper_pos]) # 生成输出文件名 out_name <- sub("\\.csv$", "_log.csv", f) # 保存处理后的矩阵,不写入行名、列名,保持和原文件结构一致 write.csv(mat, out_name, row.names = FALSE, col.names = FALSE) # 打印处理进度 cat("处理完成:", f, " → ", out_name, "\n") }
注意事项
- 如果你的原始矩阵对角线位置也存储了需要变换的有效数值,将
upper.tri()参数中的diag = FALSE修改为diag = TRUE即可 - 如果原始CSV文件第一行是列名、第一列是行名,请对应调整
read.csv()和write.csv()中的header、row.names参数,避免读入数据结构错乱 - 若担心上三角区域存在0值导致
log10计算结果为无穷大,可以在变换行前加校验代码if(any(mat[upper_pos] <= 0)) stop(paste0(f, "上三角存在非正值,终止运行")),遇到异常数据会直接报错,避免生成错误结果 - 代码不会修改原始CSV文件,所有处理结果都存在新生成的
_log.csv文件中,调试时不用担心损坏原始数据
内容的提问来源于stack exchange,提问作者Sid0311
相关产品推荐
相关产品推荐

