R中如何用lapply处理txt文件并将数据框批量保存为txt到新文件夹
问题核心错误说明
file.copy是磁盘文件复制函数,无法直接将内存中的数据框列表写入为本地txt文件,这是代码未达预期的核心原因- 原新文件名生成逻辑仅按序号命名,无法保留原有文件名
morph函数中嵌套ifelse的空值处理逻辑位置错误,会导致值替换异常
修正后可运行代码
# 加载依赖包(mutate函数来自dplyr,未安装需先执行install.packages("dplyr")) library(dplyr) # 第一步:获取原文件路径,提取原文件名生成对应新文件路径 old.files <- list.files(path="/Users/F/folder/", pattern="*.txt", full.names=TRUE, recursive=FALSE) # 提取原文件的基础文件名(不含路径) old.filenames <- basename(old.files) # 生成新文件路径,保留原文件名,前缀可根据需求自定义 new.files <- file.path("/Users/F/folder2/", paste0("New_Profile_", old.filenames)) # 第二步:修正morph函数的转换逻辑 morph <- function (x){ tx0 <- read.table(x, row.names = NULL, col.names= c("Time","Stage"), skip=7, stringsAsFactors = F) # 单独处理Stage列为空的情况 tx0$Stage[tx0$Stage == ""] <- tx0$Time[tx0$Stage == ""] # 用case_when替代多层嵌套ifelse,逻辑更清晰不易出错 tx0$Stage <- case_when( tx0$Stage %in% c("Wach", "Bewegung", "A") ~ "0", tx0$Stage == "N1" ~ "2", tx0$Stage == "N2" ~ "1", tx0$Stage == "N3" ~ "3", tx0$Stage == "N4" ~ "4", tx0$Stage == "Rem" ~ "5", # 未匹配的取值保留原值 TRUE ~ tx0$Stage ) # 新增Epoch列 tx0 <- mutate(tx0, Epoch=1:n()) return(tx0) } # 第三步:批量处理并写入新文件夹 mapply(function(old_path, new_path) { processed_df <- morph(old_path) # 写入txt文件,可根据需要调整分隔符、是否保留列名等参数 write.table(processed_df, new_path, row.names = FALSE, quote = FALSE, sep = "\t") }, old.files, new.files) # 若需要先保存所有处理后的数据框再批量写入,可使用下面的代码: # files.list <- lapply(old.files, morph) # for(i in seq_along(files.list)) { # write.table(files.list[[i]], new.files[i], row.names = FALSE, quote = FALSE, sep = "\t") # }
可选调整说明
- 不需要新文件名加
New_Profile_前缀的话,直接删除paste0里的前缀内容即可 write.table的sep参数可自定义分隔符,默认是空格,设置sep=","可输出csv格式- 如果不需要保留列名,给
write.table增加参数col.names = FALSE即可
内容的提问来源于stack exchange,提问作者Slevin
相关产品推荐
相关产品推荐

